この回答に続いて、クラスが以下を使用して定義された後にクラスのメタクラスが変更される可能性があるようです*:
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
にメタクラスの魔法がかかっているようですが、属性B
はB
ありません。__metaclass__
上記の方法は、クラスを定義して再定義しているにもかかわらず、メタクラスをクラス定義に適用する賢明な方法ですか、それとも単純に書く方がよいでしょうか
class B(object):
__metaclass__ = MyMetaClass
pass
2つの方法にはいくつかの違いがあると思います。
*注、リンクされた質問の元の回答は、次MyMetaClass(A.__name__, A.__bases__, A.__dict__)
を返しますTypeError
:
TypeError: type() 引数 3 は dict_proxy ではなく dict でなければなりません
(クラス定義)の__dict__
属性には type があるようですが、のインスタンスの属性の型には type があります。どうしてこれなの?これは Python 2.x と 3.x の違いですか?A
dict_proxy
__dict__
A
dict