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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM