熱線電話:13121318867

登錄
首頁精彩閱讀很少有人知道Python中的type與object的關系,不信你去問問
很少有人知道Python中的type與object的關系,不信你去問問
2022-08-03
收藏

作者:小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中一切皆對象,方法(函數)當然也是對象,所以方法也可作為值存入字典。

如果你也有一些疑問,請在評論區留言,

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢