作者:小K
來源:麥叔編程
簡答讀者問
要查看一個類型的父類,可以使用__bases__屬性查看,
要查看一個實例的類型可以用__class__來查看
type是object的子類,type是type的實例。
object沒有父類,object是type的實例。
這個「倫理」關係亂不亂??
type和object,分管不同的任務,但type和object又是各自的頂端。
type掌管一切類型,所以object也是type類型,type也是type類型。
而object是一切類的父類,所以type的父類又是object。
繼續用type造個元類
看過上期的小夥伴應該都記住了用type創造一個類的方式,
❝
type(類名, 父類的元組(針對繼承的情況,可以為空), 包含屬性的字典(名稱和值))
❞
今天再來學習一種用type創造類的方式,這種方式的代碼更易讀些。
先創造一個元類:
class Boing737metaClass(type):
def __new__(cls, name, bases, attrs):
attrs["plane_model_"+name] = lambda self, name: f"BoingPlane737{name}"
return type.__new__(cls, name, bases, attrs)
分析代碼:
class Boing737MetaClass(type):
繼承type,表示我要創造一個類型(元類)。
def __new__(cls, name, bases, attrs)
name, bases和attrs都是元類的老朋友了。
類名,繼承父類,包含屬性的字典(名稱和值)。
attrs["plane_model_"+name] = lambda self, name: f"BoingPlane737{name}"
確定元類中的屬性和函數(不明白可以複習上一篇元類的文章)。
return type.__new__(cls, name, bases, attrs)
返回之後,就按照傳入的參數new一個新類。
實際操作下,
class Boing737MetaClass(type):
def __new__(cls, name, bases, attrs):
attrs["plane_model_"+name] = lambda self, name: f"BoingPlane737{name}"
return type.__new__(cls, name, bases, attrs)
# 定義一個類並指定元類
class B100(object, metaclass = Boing737MetaClass):
pass
# 實例化定義的類
plane = B100()
# 調用類中來自元類的方法
print(plane.plane_model_B100(100))
plane.plane_model_B100函數名是由類名動態訂製而來。
❝
attrs["plane_model_"+name]
❞
運行上方代碼之後得到結果:
BoingPlane737100
❝
今天的內容比較抽象,概念都比較虛,所以需要花時間去理解消化。
❞
最後
今天繼續感謝歸零這位鐵粉的持續關注,我來回答你提一個問題。
在Python中一切皆對象,方法(函數)當然也是對象,所以方法也可作為值存入字典。
如果你也有一些疑問,請在評論區留言,