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

来源:互联网 发布:知乎化妆品等级 编辑:程序博客网 时间:2024/04/30 03:05

    从实用角度出发,根据数据挖掘中最长使用的语法和数据类型出发,对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:
所谓的组合就是把类的实例化放到一个新类里面,那么就把旧类组合进去了
0 0
原创粉丝点击