Python之路,Day19 = 面向对象的程序设计之继承实现的原理(继承顺序)、封装、property
以下类容参考自:http://www.cnblogs.com/metianzing/p/7121947.html
抽象类补充:
1 import abc 2 class Parent(metaclass= abc.ABCMeta): 3 x=1 4 @abc.abstractclassmethod 5 def foo(self): 6 pass 7 8 @abc.abstractclassmethod 9 def bar(self): 10 pass 11 12 class Child(Parent ): 13 def foo(self): 14 pass 15 16 def bar(self): 17 pass 18 19 c=Child() 20 print(c.x) 21 运行结果: 22 1
注意1:父类的变量可以遗传给子类
注意2:抽象类:本身不能被实例化,也不应该被实例化,它的作用就是定义标准,并不用具体实现。
继承实现的原理(继承顺序)
1 继承顺序
继承
新式类和经典类都会先找完一个分支(在多个父类没有共同父类的情况下)
当父类出现共同父类的时候,新式类广度优先,经典类深度优先(到共同父类截止)
继承顺序,可以通过 h.mro() 来查看,里面是个字典,
# 这个方法只在新式类中有
super()方法继承只能用于新式类
super()方法继承只能用于新式类
寻找顺序会按照 mro 中顺序找?怎么确定哪些属性给谁?
ptyon 3
super().__init__(name, age, sex)
python 2
super(子类,self).__init__(name, age, sex)
封装:
封装数据
封装功能
get/set方法的升级---版本一
1 #! /usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # __author__ = "Always" 4 # Date: 2017/7/2 5 6 # propetry的使用 7 8 class Test(object): 9 def __init__(self): 10 self.__num = 100 11 12 13 def getNum(self): 14 print("++++++++++++getNum++++++++++++") 15 return self.__num 16 17 def setNum(self, newNum): 18 print("++++++++++++setNum++++++++++++") 19 self.__num = newNum 20 21 num = property(getNum, setNum) # 位置参数(self, fget=None, fset=None, fdel=None, doc=None),get 在前面, set在后面 22 23 t = Test() 24 25 print(t.getNum()) 26 27 t.setNum(200) # 正常情况下,都是这么调用 28 print(t.getNum()) 29 30 31 t.num = 50 # 使用 property 后,将get、set设置成了属性,这样的话,调用起来就比较方便了。可以直接使用 32 33 print(t.num) 34 35 get/set升级版本一
get/set方法的升级---版本二
1 # Date: 2017/7/2 2 3 # propetry的使用 4 5 class Test(object): 6 def __init__(self): 7 self.__num = 100 8 9 # get写前面,set写后面,两个函数名字一样,函数名为后面的取值依据,个体前面写 property,set写 函数名.setter 10 @property 11 def num(self): 12 print("++++++++++++getNum++++++++++++") 13 return self.__num 14 15 @num.setter 16 def num(self, newNum): 17 print("++++++++++++setNum++++++++++++") 18 self.__num = newNum 19 20 @num.deleter 21 def num(self): 22 print("++++++++++++deNum++++++++++++") 23 del self.__num 24 25 # 话句话说, 前面加 property 的时候,就把这个函数变成了一个属性(变量) 这样的话,代表可以直接执行 26 # 这种情况下如果遇到有参数的时候,传参数可以参考 setter 这个赋值的操作,也就是,写两个咯。。。多试大兄弟 27 t = Test() 28 29 t.num = 50 30 print(t.num) 31 32 del t.num # 通过这个可以删除 __num 这个私有属性 33 34 # 上面就是三个属性的装饰器 35 # 通常可以只提供一个查询的结果的接口给别人(这个函数里面可可以添加好多的流程) 36 37 get/set升级版本二