Python/元類
外觀
< Python
在Python語言中,類(class)也是對象,即是特定類的實例。這裡的特定類就是元類(metaclass)。
Python3
[編輯]Python3的元類的新變化,見Pep 3115。
元類的方法__prepare__可以被調用,以創建一個詞典或其它類,以存儲元類實例(即普通類)的類成員。[1]
元類的方法__new__可以被調用,以創建類的新實例。[2]
type作為元類
[編輯]Python的所有標準類型是"type"類的實例。即標準類型的元類是"type"。
>>> type(object)
<type 'type'>
>>> type(int)
<type 'type'>
>>> type(list)
<type 'type'>
如同list, int, object, "type"自身也是正常的Python對象,是元類的實例。實際上,它是其自身的實例:
>>> type(type)
<type 'type'>
給元類傳遞新類的名字(作為字符串)、繼承的基類的列表、類成員名字組成的字典,就可以把元類當作類工廠創建其實例,即新類:
>>> class MyClass(BaseClass):
... attribute = 42
可寫作:
>>> MyClass = type("MyClass", (BaseClass,), {'attribute' : 42})
自定義的元類
[編輯]在創建一個類時,可以用metaclass關鍵字指定不同於"type" 的元類。這個類及其子類將使用定製的元類。例如:
class CustomMetaclass(type):
def __init__(cls, name, bases, dct):
print "Creating class %s using CustomMetaclass" % name
super(CustomMetaclass, cls).__init__(name, bases, dct)
class BaseClass(metaclass=CustomMetaclass):
pass
class Subclass1(BaseClass):
pass
這將打印:
Creating class BaseClass using CustomMetaclass Creating class Subclass1 using CustomMetaclass
使用定製元類,在創建類時可以增加或刪除屬性與方法,註冊一個類或其子類的創建。
更多資源
[編輯]- Wikipedia article on Aspect Oriented Programming
- Unifying types and classes in Python 2.2
- O'Reilly Article on Python Metaclasses