說明
python為所有類提供乙個__bases__
屬性,通過該屬性可以檢視該類的所有直接父類,該屬性返回所有直接父類組成的元組
python為所有類提供了乙個__subclasses__()
方法,通過該方法可以檢視該類的所有直接子類,該方法返回該類的所有子類組成的列表
子類繼承父類的私有方法重寫無效,公有方法可以重寫,引用父類方法可用super()
實現
來個特別的例子
from collections import hashable
print
(issubclass
(list
,object))
# true
print
(issubclass
(object
, hashable)
)# true
print
(issubclass
(list
, hashable)
)# false
list 是object的子類, object是hashable的子類, 子類關係應該是可以傳遞的, 為什麼list不是hashable的子類?
python 中的子類關係並不一定是傳遞的. 任何人都可以在元類中隨意定義__subclasscheck__
a. 元類可以簡稱為類的類
b. type是python的乙個內建元類,用來直接控制生成類
c. 在python當中任何class定義的類其實都是type類例項化的結果
d. 只有繼承了type類才能稱之為乙個元類,否則就是乙個普通的自定義類,
自定義元類可以控制類的產生過程,類的產生過程其實就是元類的呼叫過程
classa(
type):
def__subclasscheck__
(self, subclass)
:print
('invoke __subclasscheck__'
)return
true
def__hash__
(self)
:print
('__hash__'
)class
b(metaclass=a)
:pass
print
(issubclass
(list
, b)
)>invoke __subclasscheck__
>
true
當issubclass(cls, hashable)
被呼叫時, 它只是在 cls 中尋找__hash__
方法或者從繼承的父類中尋找__hash__
方法
由於object
是可雜湊的(hashable), 但是list
是不可雜湊的, 所以它打破了這種傳遞關係
C 子型別關係
公有繼承時,派生類的物件可以作為基類的物件處理,派生類是基類的子型別。子型別關係使得在需要基類物件的任何地方都可以使用公有派生類的物件來替代,從而可以使用相同的函式統一處理基類物件和公有派生類物件 形參為基類物件時,實參可以是派生類物件 大大提高了程式的效率。子型別關係是實現多型性的重要基礎之一。子...
python建立子類 python 建立子類
如果你的類沒有從任何祖先類派生,可以使用object作為父類的名字。經典類的宣告唯一不同之處在於其 沒有從祖先類派生 此時,沒有圓括號 usr bin env python coding utf 8 class classicclasswithoutsuperclasses def fun1 sel...
python子類 python 子類和派生 繼承
新式類和經典類得區別 class classicclass pass class newstyleclass object pass x1 classicclass x2 newstyleclass print x1.class type x1 print x2.class type x2 輸出結果...