python繼承方案 Python 繼承

2021-10-21 07:20:04 字數 3891 閱讀 1851

繼承

python 中所有的類都是object類的子類,而object 繼承自type

繼承分為 介面繼承和實現繼承

介面繼承:使用父類的介面名,子類重寫這個方法。盡可能的繼承介面類,在子類中實現方法,鼓勵對介面類的多繼承,這樣遵循介面隔離原則,有利於歸一化設計,不提倡對抽象類進行多繼承

一些細節

類繼承最終要被例項化,我們多數時候使用的還是物件而不是類。因此我們還是來一點點看繼~

繼承的過程

承僅僅是一種**復用的手段,並不會講**全部的載入到子類的空間中,方法依然屬於父類。下面的例子能看到,cat.func 依然是 animal 的,更近一步的理解,func 也僅僅是func,它只是被繫結到了類 animal上而已,類 只是能幫我們找到這個函式,子類通過父類找到這個函式就完了~ 。

class animal(object):

def func(self):

print("animal.func")

class dog(animal):

def func(self):

print('dog.func')

class cat(animal):

""" no func~ """

print(animal.func) #

print(cat.func) #

print(dog.func) #

例項化的過程

例項化過程中屬性和方法並不會出現在例項的空間裡。它們依然屬於類本身,物件也只是能找到他們,然後呼叫他們。但是當修改物件的屬性時,會在物件的空間中建立同名的屬性。這是屬於物件的屬性。複雜的繼承其本質也是一樣的。

class animal(object):

def tell(self):

print('self.name:%s animal.name %s ' % (id(self.name), id(animal.name)))

name = 'animal'

class cat(animal):

""" no func~ """

def tell(self):

super().tell()

print('self.name %s cat.name %s '% (id(self.name), id(cat.name)))

cat = cat()

cat.tell()

cat.name = 'django'

cat.tell()

# self.name:4473398472 animal.name 4473398472

# self.name 4473398472 cat.name 4473398472

# self.name:4474859736 animal.name 4473398472

# self.name 4474859736 cat.name 4473398472

單繼承越靠近本類的方法會覆蓋祖輩的方法,這叫方法的覆蓋或重寫 原理是 python的屬性檢索機制 從內層命名空間往外查詢

class myclass(object):

a ****** example class

myclassname = 'myclass'

name = 'myclass'

def func(self):

print("this is {}".format(self.__class__.name))

def get_name(self):

print(self.name)

class mysonclass(myclass):

mysonclass = 'mysonclass'

name = 'mysonclass' # 屬性的重寫

def get_name(self):

super().get_name()

print('我重寫了父類的get_name方法,上面是父類的方法,我來自子類!')

person1 = myclass()

person2 = mysonclass()

person1.func()

person2.func() # 方法的實現繼承 自己沒有,會直接呼叫父類的方法。但是使用的屬性還是自己的。

print('*'*40)

person1.get_name()

person2.get_name() # 方法的介面繼承,在子類中重寫了這個方法。

# 結果

# this is myclass

# this is mysonclass

# myclass

# mysonclass

# 我重寫了父類的get_name方法,上面是父類的方法,我來自子類!

多繼承就形式上來說,類的繼承列表可以是乙個,也可以是多個,當繼承列表只有乙個類時,也就是只有乙個父類時,稱為單繼承,大於乙個類,就稱為多繼承。

新式類的繼承方式為 廣度優先繼承 經典類的繼承方式為 深度優先繼承。

類繼承的順序可以使用類的 __mro__ 方法檢視。

鑽石繼承

class a(object):

m = 'a'

class b(a):

m = 'b'

class c(a):

m = 'c'

class d(b,c):

# m = 'd'

pass

x = d()

print(x.m)

# d 的例項化物件如果獲取 m 屬性會優先的尋找自己的命名空間,查詢順序為 d -> b -> c -> a

super()方法

語法super(類,例項化物件).父類的方法

當super()方法在類的內部使用時候,甚至不需要任何的引數

當在多繼承中使用super()方法的時候執行的不再是父類的方法了 而是和mro中上一級的方法

super()為了解決多繼承中,初始化方法被重複呼叫的問題。(當使用類名.方法名的時候)

當使用super()方法執行「父類」 (__mro__ 方法的上乙個類) 的方法

# 鑽石繼承中的 重複呼叫問題

# 注意 繼承的查詢順序~ 使用super()將按照 mro 順序執行

class grand(object):

def __init__(self, name):

self.name = name

print("class grand ")

class sonleft(grand):

def __init__(self, age, name):

self.age = age

grand.__init__(self, name) # 注釋調 跑一跑 看一看

# super().__init__(age, name)

print("class sonleft")

class sonright(grand):

def __init__(self, gender, name):

self.gender = gender

grand.__init__(self, name) # 注釋調 跑一跑 看一看

# super().__init__(name)

print("class sonright")

class grandson(sonleft, sonright):

def __init__(self, name, age, gender):

# super().__init__(age, name)

sonleft.__init__(self, age, name) # 注釋調 跑一跑 看一看

sonright.__init__(self, gender, name) # 注釋調 跑一跑 看一看

self.gender = gender

grand_son = grandson("monkey", 18, "男")

python菱形繼承 Python 繼承

python繼承 思維導圖 什麼是繼承?繼承是一種關係,描述兩個物件之間,什麼是什麼的關係 例如麥兜,佩奇,豬剛鬣 都是豬啊,在程式中,繼承描述的是類和類之間的關係 例如a繼承了b,a就能直接使用b已經存在的方法和屬性 a稱之為子類,b稱之為父類,也稱之為基類 為什麼要使用繼承 繼承的一方可以直接使...

python繼承問題 python繼承細節

不要子類化內建型別 內建型別 由c語言編寫 不會呼叫使用者定義的類覆蓋的特殊方法。例如,子類化dict作為測驗 classdoppedict dict def setitem self,key,value super setitem key,value 2 改為重複存入的值 dd doppedict...

python封裝繼承 python繼承 封裝

python繼承 封裝 1 為什麼要封裝 封裝資料的主要原因是 保護隱私 封裝方法的主要原因是 隔離複雜度 2 封裝分為兩個層面 第乙個層面的封裝 什麼都不用做 建立類和物件會分別建立二者的命名空間,我們只能用類名.或者obj.的方式去訪問裡面的名字,這本身就是一種封裝 r1.nickname 草叢...