2012-06-07 14 views
12

Ben CPython 3.2.2 yılında metaclasses ile de oynuyordum ve bunu kendi türüdür bir sınıf ile bitirmek mümkündür fark ettik: Bizim metaclass A içinPython - bir nesne kendi türü olabilir?

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 

, gerçekten orada görünmüyor sınıf ve örneği arasında bir ayrımın fazla olması özellikleri: CPython 2.7.2 PYPY 1.6.0 (içinde

>>> 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__` 

Bu aynı şekilde çalışır Tüm bileşenler (__metaclass__ için değiştirmesini ve __next__ özel bir yöntem olarak değil) Python 2.7.1) ve Jython 2.2.1'i uygulayan Varsa, sürüm - Jython ile çok aşina değilim).

__class__'a atanmaya izin verildiği koşullar hakkında fazla bir açıklama bulamıyorum (görünüşte ilgili türlerin kullanıcı tanımlı olması ve bir anlamda benzer bir düzen olması gerekir). Çalışmanın __class__'a atanması için'un hem bir alt sınıf hem de MC örneğinin olması gerektiğine dikkat edin. Bunun gibi özyineli meta sınıf hiyerarşileri gerçekten kabul edilebilir mi? Kafam çok karışık.

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

Yani bile standart metaclass type kendi türüdür:

+1

Python türleri hakkında çok şey açıklayan bir belge şudur: http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html Bu durumu tartışmayacak gibi görünmesine rağmen, her şeyi temizlemelidir. –

cevap

6

Recursive metaclass hierachies aslında dil çekirdeğinin bir parçasıdır. Bu yapıda herhangi bir kavramsal problem yoktur - sadece sınıf puanlarının sınıfa ait __class__ özniteliği anlamına gelir.

__class__ özniteliği atamaları yalnızca kullanıcı tanımlı sınıflar için izin verilir. Ödev, hem orijinal sınıf hem de yeni sınıf __slots__ tanımlamazsa veya her ikisi de aynı sıraya __slots__ olarak ayarlanmışsa yasaldır.

İlgili konular