很少有人知道Python中的type與object的關係,不信你去問問

cda數據分析師 發佈 2022-08-02T23:08:26.069520+00:00

要查看一個類型的父類,可以使用__bases__屬性查看,要查看一個實例的類型可以用__class__來查看。

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

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

關鍵字: