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

  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • Edgar flores

    Edgar flores

    7 HAZİRAN 2006
  • girleffect

    girleffect

    20 Mayıs 2008