2017-05-08 21 views
2

私はクラスオブジェクトを持っています。clsです。私はそのメタクラスを知りたい。これはどうすればいいですか?Pythonでクラスのメタクラスを調べる方法

(私はその親クラスを知りたいと思った場合、私はcls.__mro__を行うだろうメタクラスを取得するには、このようなものがあります。?)

+2

ちょうど 'type(cls)' – vaultah

+0

@Jim IMOは、クラスオブジェクトの型が作成されたメタクラスである理由を説明します。 – vaultah

+0

OPの質問が実際に* why *と* how *を確認するように再フォーマットされている場合は、@vaultahを確認してください。現在のところ、私は個人的に再開すべきだとは思わない。あなたがまだそれが保証されていると信じるならば、自由に感じてください。 –

答えて

2

[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> 
関連する問題