私は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
のインスタンスの両方である必要があります。このような再帰的なメタクラス階層は本当に受け入れられるはずですか?私は非常に混乱しています。
Pythonの種類について多くのことを説明している文書は、次のとおりです。http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.htmlこれは、この状況について議論するようには見えませんが、問題は解決するはずです。 –