python的类的继承-接口继承-归一化设计
1、先在子类本身找,如果子类没有,会去父类找
class Dad: '这个是爸爸类' money=10#Dad类的数据属性 def __init__(self,name): print("爸爸") self.name=name def hit_son(self): print("%s 正在打儿子" %self.name) class Son(Dad): pass print(Son.money)#继承父类的数据属性 s1=Son("gouguoqi")#实例化的时候因为本身没有,所以会触发父类的init # Son.hit_son() # print(Dad.__dict__)#打印父类的属性字典 # print(Son.__dict__) C:\python35\python3.exe D:/pyproject/day25/继承.py 10 爸爸
2、如果子类中的属性和父类的属性重名的话,不会覆盖父类的,而是调用哪个就是哪个值
class Dad: '这个是爸爸类' money=10#Dad类的数据属性 def __init__(self,name): print("爸爸") self.name=name def hit_son(self): print("%s 正在打儿子" %self.name) class Son(Dad): money = 20 pass print(Son.money)#子类有和这个数据属性 s1=Son("gouguoqi")#实例化的时候就先从本身找到了 print(s1.name) print(s1.money)#打印实例的数据属性,自己没有就去父类找 print(Dad.money)#打印父类的数据属性 print(s1.__dict__)#查看实例的属性字典 s1.hit_son()#调用父类的函数属性 C:\python35\python3.exe D:/pyproject/day25/继承.py 20 爸爸 gouguoqi 20 10 {'name': 'gouguoqi'} gouguoqi 正在打儿子
3、给儿子类也增加一个init函数属性和hit_son的函数属性,然后在实例化的时候就先在儿子类本身找了,找到就执行了
class Dad: '这个是爸爸类' money=10#Dad类的数据属性 def __init__(self,name): print("爸爸") self.name=name def hit_son(self): print("%s 正在打儿子" %self.name) class Son(Dad): money = 100000099 def __init__(self,name,age): self.name=name self.age=age def hit_son(self): print("来自儿子类的hitson") s1=Son("gouguoqi",28)#实例化的时候因为本身没有,所以会触发父类的init s1.hit_son() C:\python35\python3.exe D:/pyproject/day25/继承.py 来自儿子类的hitson
4、我们来看这个例子,很明显这吃喝拉撒都属于2个类的共同的地方,所以我们可以把这个做成一个父类,然后让子类都继承一下就可以了
class Cat():#定义一个猫的类,猫有叫吃喝拉撒的5个函数属性 def miaomiaojiao(self): print("喵喵叫") def chi(self): pass def he(self): pass def la(self): pass def sa(self): pass class Dog():#定义一个狗的类,狗有叫吃喝拉撒的5个函数属性 def wangwangjiao(self): print("汪汪叫") def chi(self): pass def he(self): pass def la(self): pass def sa(self): pass
改进之后
class Animal(): def chi(self): pass def he(self): pass def la(self): print("正在拉屎") def sa(self): pass class Cat(Animal):#继承父类Animal def miaomiaojiao(self): print("喵喵叫") class Dog(Animal):#继承父类Animal def wangwangjiao(self): print("汪汪叫") print(Cat.__dict__) Cat.la(11) C:\python35\python3.exe D:/pyproject/day25/继承.py {'__module__': '__main__', 'miaomiaojiao': <function Cat.miaomiaojiao at 0x0000000000702400>, '__doc__': None} 正在拉屎
上面这个吃喝拉撒就是继承的父类的,miaomiaojiao和wangwangjiao就是派生,
上面这种情况尽量别用,因为从程序角度来看,子类和父类已经耦合到一起了。。。不利于后期的扩展和改动了
5、接口继承
接口继承就是(基类)父类定义好2个函数属性(接口),所有的子类必须有这2个函数属性,缺一不可,不是说省代码的,是用来做强制性约束的
基类里面的方法不用具体的实现,只是一个规范而已
5.1实现一个一切皆文件的概念
class Disk: def read(self): pass def write(self): pass class Cdrom: def read(self): pass def write(self): pass class Mem: def read(self): pass def write(self): pass
5.2可以定义一个基类,对上面代码进行改进
class Allfile: def read(self): pass def write(self): pass class Disk(Allfile): def read(self): print("disk read") def write(self): print("disk write") class Cdrom(Allfile): def read(self): print("cdrom read") def write(self): print("cdrom write") class Mem(Allfile): def read(self): print("mem read") def write(self): print("mem write")
5.3但是子类也可以不按照你规定的出牌,Mem就是不听话,他不定义write的函数属性,然后就会从父类找。父类里面又是pass
class Allfile: def read(self): pass def write(self): pass class Disk(Allfile): def read(self): print("disk read") def write(self): print("disk write") class Cdrom(Allfile): def read(self): print("cdrom read") def write(self): print("cdrom write") class Mem(Allfile): def read(self): print("mem read") m1=Mem() m1.read() m1.write() C:\python35\python3.exe D:/pyproject/day25/接口继承.py mem read
5.4所以python就有一个专门的模块来实现这个强制性的约束子类,模块叫abc
导入模块abc,给父类2个属性加上装饰器之后,如果子类再少属性的话,就直接报错了,这样就强制性的约束了子类必须有父类的2个方法了
import abc class Allfile(metaclass=abc.ABCMeta): @abc.abstractstaticmethod def read(self): pass @abc.abstractstaticmethod def write(self): pass class Disk(Allfile): def read(self): print("disk read") def write(self): print("disk write") class Cdrom(Allfile): def read(self): print("cdrom read") def write(self): print("cdrom write") class Mem(Allfile): def read(self): print("mem read") m1=Mem() TypeError: Can't instantiate abstract class Mem with abstract methods write
5.5当子类Mem也加上write这个方法之后就可以正常运行了
import abc class Allfile(metaclass=abc.ABCMeta): @abc.abstractstaticmethod def read(self): pass @abc.abstractstaticmethod def write(self): pass class Disk(Allfile): def read(self): print("disk read") def write(self): print("disk write") class Cdrom(Allfile): def read(self): print("cdrom read") def write(self): print("cdrom write") class Mem(Allfile): def read(self): print("mem read") def write(self): print("mem write") m1=Mem() m1.read() m1.write() C:\python35\python3.exe D:/pyproject/day25/接口继承.py mem read mem write