繼this answer似乎一類元類的元類可以改變類已經被定義後,使用以下*設置類:使用裝飾
class MyMetaClass(type):
# Metaclass magic...
class A(object):
pass
A = MyMetaClass(A.__name__, A.__bases__, dict(A.__dict__))
定義功能
def metaclass_wrapper(cls):
return MyMetaClass(cls.__name__, cls.__bases__, dict(cls.__dict__))
讓我一個裝飾應用於類定義像這樣,
@metaclass_wrapper
class B(object):
pass
它看ms表明元類魔術應用於B
,但B
沒有__metaclass__
屬性。是上述方法來元類應用類定義一個合理的方式,即使我definiting並重新definiting類,或者我會過得更好只是寫
class B(object):
__metaclass__ = MyMetaClass
pass
我相信有這兩者之間的一些差異方法。
*注意,在鏈接的問題,MyMetaClass(A.__name__, A.__bases__, A.__dict__)
原來的答案,返回TypeError
:
TypeError: type() argument 3 must be a dict, not dict_proxy
看來的A
(類定義)的__dict__
屬性有一個類型dict_proxy
,而__dict__
屬性的類型實例的A
的類型爲dict
。爲什麼是這樣?這是一個Python 2.x與3.x的區別嗎?
我只是想知道是否有一個裝飾器等效於在類定義中設置__metaclass__屬性。我想我的問題的另一部分是我的'裝飾'似乎*工作,但我注意到,裝飾類沒有'__metaclass__'屬性,所以這兩種方法之間顯然是有區別的;爲什麼是這樣? – Chris