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
