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:
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. –