Python的元類

程式設計師小城發表於2019-03-15

什麼是元類(metaclass)?

元類是類的類,是類的模板

元類的例項為類,正如類的例項為物件

class Foo:

pass

t1=Foo #t1是通過Foo類例項化的物件

print(type(f1))

print(type(Foo))

所有的物件都是例項化或者說呼叫類而得到的(呼叫類的過程稱為類的例項化),比如物件t1是呼叫FOO類得到的一個例項。

如果一切皆為物件,那麼類Foo本質也是一個物件,既然所有的物件都是呼叫類得到的,那麼Foo必然也是呼叫了一個類得到的,這個類稱為元類。

一般來說,元類均被命名字尾為Metalass。想象一下,我們需要一個可以自動打招呼的元類,它裡面的類方法呢,有時需要say_Hello,有時需要say_Hi,有時又需要say_Sayolala,有時需要say_Nihao。

如果每個內建的say_xxx都需要在類裡面宣告一次,那將是多麼可怕的苦役! 不如使用元類來解決問題。

以下是建立一個專門“打招呼”用的元類程式碼:

Python

class SayMetaClass(type):

def __new__(cls, name, basesattrs):

attrs['say_'+name] = lambda self,value,saying=name: print(saying+','+value+'!')

return type.__new__(cls, name, bases, attrs)

class SayMetaClass(type):

def __new__(cls, name, bases, attrs):

attrs['say_'+name] = lambda self,value,saying=name: print(saying+','+value+'!')

return type.__new__(cls, name, basesattrs)

記住兩點:

1、元類是由“type”衍生而出,所以父類需要傳入type。【道生一,所以一必須包含道】

2、元類的操作都在 __new__中完成,它的第一個引數是將建立的類,之後的引數即是三大永恆命題:我是誰,我從哪裡來,我將到哪裡去。 它返回的物件也是三大永恆命題,接下來,這三個引數將一直陪伴我們。

相關文章