2012-06-07 8 views
12

私はCPythonの3.2.2でメタクラスで遊んでた、と私は独自​​のタイプであるクラスで終わることが可能である気づいた。私たちのメタクラスAについてはPython - オブジェクトは独自の型にすることができますか?

Python 3.2.2 (default, Sep 5 2011, 21:17:14) 
[GCC 4.6.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> class MC(type):   #a boring metaclass that works the same as type 
...  pass 
... 
>>> class A(MC, metaclass=MC): #A is now both a subclass and an instance of MC... 
...  pass 
... 
>>> A.__class__ = A   #...and now A is an instance of itself? 
>>> A is type(A) 
True 

、実際にそこにいないようですクラスとインスタンスとの間の区別の多くなるようにすると、属性:

>>> A.__next__ = lambda self: 1 
>>> next(A) 
1          #special method lookup works correctly 
>>> A.__dict__ 
dict_proxy({'__module__': '__main__', 
'__next__': <function <lambda> at 0x17c9628>, 
'__doc__': None}) 
>>> type(A).__dict__ 
dict_proxy({'__module__': '__main__', 
'__next__': <function <lambda> at 0x17c9628>, 
'__doc__': None})        #they have the same `__dict__` 

すべてこれはCPythonの2.7.2、PyPy 1.6.0(同じ(離れ__metaclass__に変化、及び__next__は特別な方法ではないから)動作しますPython 2.7.1を実装している)、およびJython 2.2.1(Python私はJythonにあまり慣れていません)。

__class__への割り当てが許可されている条件についての説明はほとんどありません(明らかに、関係するタイプはユーザー定義で、ある意味では同様のレイアウトでなければなりません)。 Aは、__class__への割り当てが機能するには、サブクラスとMCのインスタンスの両方である必要があります。このような再帰的なメタクラス階層は本当に受け入れられるはずですか?私は非常に混乱しています。

+1

Pythonの種類について多くのことを説明している文書は、次のとおりです。http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.htmlこれは、この状況について議論するようには見えませんが、問題は解決するはずです。 –

答えて

6

再帰メタクラスhierachiesは、実際には言語のコアの一部である:

>>> type(type) 
<class 'type'> 

そうでも標準メタクラスtypeは、独自のタイプです。このコンストラクトには概念的な問題はありません。クラスの属性が__class__であることを意味します。

__class__属性への割り当ては、ユーザー定義クラスに対してのみ許可されます。元のクラスと新しいクラスの両方が__slots__を定義していないか、または両方とも__slots__を同じシーケンスに設定している場合、割り当ては合法です。

関連する問題