SORU
9 HAZİRAN 2010, ÇARŞAMBA


miras tutarsızlık metaclass birden fazla

Bu yüzden:

class MyType(type):
    def __init__(cls, name, bases, attrs):
        print 'created', cls
class MyMixin:
    __metaclass__ = MyType
class MyList(list, MyMixin): pass

Tamam, beklendiği gibi çalışır:

created <class '__main__.MyMixin'>
created <class '__main__.MyList'>

Ama bu:

class MyType(type):
    def __init__(cls, name, bases, attrs):
        print 'created', cls
class MyMixin:
    __metaclass__ = MyType
class MyObject(object, MyMixin): pass

Tamam değil, ve böylece?: darbeler.

created <class '__main__.MyMixin'>
Traceback (most recent call last):
  File "/tmp/junk.py", line 11, in <module>
    class MyObject(object, MyMixin): pass
TypeError: Error when calling the metaclass bases
    Cannot create a consistent method resolution
order (MRO) for bases object, MyMixin

CEVAP
9 HAZİRAN 2010, ÇARŞAMBA


Özel metaclass sorun (ama değilteşhissahne metaclass):

>>> class Normal(object): pass
... 
>>> class MyObject(object, Normal): pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
    Cannot create a consistent method resolution
order (MRO) for bases object, Normal

ve sorun bu gibi:

>>> class Derived(Normal): pass
... 
>>> class Ok(Derived, Normal): pass
... 
>>> class Nope(Normal, Derived): pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
    Cannot create a consistent method resolution
order (MRO) for bases Normal, Derived

yani, bir temel sınıf imkansız her zamanki YAPILIR kısıtlamalar karşılayan tutarlı bir MODİFİKASYON tanımlamak için türetilmiş bir sınıf. bunun ardından gelen miras çarpma/garanti eder.

Neyse ki, bilmiyorsunistiyorumalt -- muhtemelen temel sınıf (normal sınıfları . bazı yöntem geçersiz kılar bunu ^em>yapın;- ) ve temel sınıf olan "ön" anlamına geleceğini "uzak geçersiz kılma gölgesi".

Temel sınıf koyaraksonratüretilmiş bir işe yaramaz, ama en azından (normal BAKIM ve Garanti ile tutarlı) zararsız.

Tabii ki ilk örnek MyMixin) olurdeğillist türetilen:

>>> MyMixin.__mro__
(<class '__main__.MyMixin'>, <type 'object'>)

...amaobject (türetilen modern tarzı her Python dersi gibi), ikinci örnek çalışma (oldukça bağımsız MyMixin özel bir metaclass olan) olamaz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • cyriak

    cyriak

    29 Mart 2006
  • Gee Cee

    Gee Cee

    1 AĞUSTOS 2009
  • sknbp

    sknbp

    16 Kasım 2006