您的位置:首页 > 编程语言 > Python开发

python的类和对象---python入门学习(四)

2016-12-08 11:05 148 查看
    从实用角度出发,根据数据挖掘中最长使用的语法和数据类型出发,对python进行学习,主要包含一下几个模块:数据类型、文件系统、函数、类和对象。学习了一段时间python之后,python相较于matlab最大的区别是编程思想和BIF。由原来的面向过程到现在的面向对象,python无处不对象,这句话体会会随着对python的了解而更加深刻。初学难免有疏漏或者错误,欢迎大家指正。

类和对象

1. 公有和私有

python中并没有C++中的权限控制关键字 public和private。默认都是公有的。python默认所有的属性都是共有的,但是为了实现类似于私有变量的特征,在python中定义私有变量只需要在变量名或者函数名前面加上"__"双下划线即可。

这样在外部就将变量“隐藏”起来了,理论上需要访问就需要从内部访问,但是这个技术的名字叫名字改编,就不难发现其实是python把双下划线开头的变量进行了改名,在外部访问需要使用"_类名__变量名"

p._person__name,也是可以访问的。

  
2. 继承

在python中继承和C++只是格式上有点不同:

class 类名(被继承的类)

如果是父类,没有要继承的类,则:

class 类名(object)

在C++中实例化一个对象,程序会先调用父类的构造函数,再调用子类的构造函数,而在python中不是这样的,在执行机制上更简单,当一个函数被重写了,就不会再调用父类的函数了,相当于把父类的方法隐藏了。

在这种情况下,我们可以通过两种方法来实现:

(1)调用未绑定的父类的方法(__init__)

import random as r

class Fish(object):

    def __init__(self):

        self.x = r.randint(0,10)

        self.y = r.randint(0,10)

    def move(self):

        self.x -= 1

        print "我现在的位置是 :",self.x,self.y

        

class Goldfish(Fish):

    pass
class Shark(Fish):

    def __init__(self):

        self.hungry = True

        Fish.__init__(slef)    #将父类同时初始化,这里面的self是子类的self

    def eat(self):

        if self.hungry == True:

            print("一直吃是最幸福的~ ")

            self.hungry = False

        else:

            print("终于吃不下了")

(2)使用super函数(更优的方案)

super函数能够帮我们自动找到基类的方法,并且还自动的传入参数  

class Goldfish(Fish):

    pass
class Shark(Fish):

    def __init__(self):

        self.hungry = True

        super().__init__()    #自动寻找基类和对应的参数,并且初始化。

    def eat(self):

        if self.hungry == True:

            print("一直吃是最幸福的~ ")

            self.hungry = False

        else:

            print("终于吃不下了")  

super函数的“超级”之处在于你不需要明确给出任何基类的名字,它会自动帮我们找到所有的基类以及对应的方法,由于你不需要给出基类的名字,这就意味着如果需要改变继承关系,只需要改变class语句里的父类即可,而不必在大量代码中去修改所有被继承的方法  

多重继承:

class类名(类名1,类名2...)

多继承很容易导致代码混乱,所以当你不确定必须使用多继承的时候,尽量避免使用多继承

组合:  

如果类之间不是纵向的关系,而是横向的关系,则可以用组合来实现

比如一个泳池里面需要有鱼类还需要有乌龟类

class Turtle(object):

    def __init__(self,x):

        self.num = x

class Fish(object):

    def __init__(self,y):

        self.num = y

class Pool(object):

    def __init__(self,x,y):

        self.turtle = Turtle(x)

        self.fish = Fish(y)

    def print_num(self):

        print "gongyou %d zhi wugui %d zhi yu:" %(self.turtle.num,self.fish.num)

pool = Pool(1,9)

pool.print_num()

>>> gongyou 1 zhi wugui 9 zhi yu:

所谓的组合就是把类的实例化放到一个新类里面,那么就把旧类组合进去了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: