私はクラスオブジェクトを持っています。cls
です。私はそのメタクラスを知りたい。これはどうすればいいですか?Pythonでクラスのメタクラスを調べる方法
(私はその親クラスを知りたいと思った場合、私はcls.__mro__
を行うだろうメタクラスを取得するには、このようなものがあります。?)
私はクラスオブジェクトを持っています。cls
です。私はそのメタクラスを知りたい。これはどうすればいいですか?Pythonでクラスのメタクラスを調べる方法
(私はその親クラスを知りたいと思った場合、私はcls.__mro__
を行うだろうメタクラスを取得するには、このようなものがあります。?)
[OK]を - そう、クラスのメタクラスは、単に独自の「タイプ」で、 type(cls)
と他の手段、例えばcls.__class__
によって与えられる。
Python 3.xでは、あいまいさはありません。メタクラスを作成する構文は、クラス宣言文の名前付きパラメータとしてそのまま渡すためです。
しかし、Python 2.xでメタクラスを作成するために使用される構文は、注目に値する副作用を生成します。
class A(object):
__metaclass__ = MyMeta
をやっ
時に__metaclass__
属性は、実際のメタクラスは、別の1場合でも、実際のクラスではその値に設定されています。
は考えてみましょう:
def class_pre_decorator(name, bases, namespace):
# do something with namespace
return type(name, bases, namespace)
これは、Python 2と3の両方のメタクラス宣言で使用することができます呼び出し可能である - そしてそれが有効です。解決後、両方の場合の実際のメタクラスは単にtype
になります。しかし、Python 2.xでは、cls.__metaclass__
は呼び出し可能なclass_pre_decorator
を指しています。さらに厳しいtype(cls)
が正しいメタクラスであるtype
を返します(このようにcallablesを使用すると、クラスがさらにサブクラス化されたときにagianには使用されません)オン
class A(object):
__metaclass__ = class_pre_decorator
:それは使用されたことを実際にそれは(クラスの属性を設定するように)他のヒントを与えていない場合は、クラスをインスタンス化するために使用呼び出し可能を推測するためにはPython 3の方法はありません
コンソール:
In [8]: type(A)
Out[8]: type
In [9]: A.__metaclass__
Out[9]: <unbound method A.class_pre_decorator>
ちょうど 'type(cls)' – vaultah
@Jim IMOは、クラスオブジェクトの型が作成されたメタクラスである理由を説明します。 – vaultah
OPの質問が実際に* why *と* how *を確認するように再フォーマットされている場合は、@vaultahを確認してください。現在のところ、私は個人的に再開すべきだとは思わない。あなたがまだそれが保証されていると信じるならば、自由に感じてください。 –