元類簡介
什麼是元類?
在 Python 中,一切都是物件:整數,字串,列表,甚至函式和類本身都是物件。每個物件都是一個類的例項。
要檢查物件 x 的類,可以呼叫 type(x)
,所以:
>>> type(5)
<type 'int'>
>>> type(str)
<type 'type'>
>>> type([1, 2, 3])
<type 'list'>
>>> class C(object):
... pass
...
>>> type(C)
<type 'type'>
python 中的大多數類都是 type
的例項。type
本身也是一個類。其例項也是類的類稱為元類。
最簡單的元類
好的,所以 Python 中已經有一個元類:type
。我們可以創造另一個嗎?
class SimplestMetaclass(type):
pass
class MyClass(object):
__metaclass__ = SimplestMetaclass
這不會新增任何功能,但它是一個新的元類,請看 MyClass 現在是 SimplestMetaclass 的一個例項:
>>> type(MyClass)
<class '__main__.SimplestMetaclass'>
做某事的元類
在呼叫建立類的原始 __new__
之前,執行某些操作的元類通常會覆蓋 type
的 __new__
,以修改要建立的類的某些屬性:
class AnotherMetaclass(type):
def __new__(cls, name, parents, dct):
# cls is this class
# name is the name of the class to be created
# parents is the list of the class's parent classes
# dct is the list of class's attributes (methods, static variables)
# here all of the attributes can be modified before creating the class, e.g.
dct['x'] = 8 # now the class will have a static variable x = 8
# return value is the new class. super will take care of that
return super(AnotherMetaclass, cls).__new__(cls, name, parents, dct)