سؤال

هذه مسألة فضول أكثر من كونها قضية جدية:

كنت أتلاعب بالميراث المتعدد وصادفت هذا:

>>> class A(object):
...     def __init__(self): print "A.__init__() called"
...
>>> class B(object, A): pass
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Cannot create consisten method resolution
order (MRO) for bases object, A

أحصل على TypeError.ومع ذلك، عندما أقوم بعكس ترتيب الميراث المتعدد:

>>> class B(A, object): pass
>>> b = B()
A.__init__() called

أنه يعمل بشكل جيد.لقد افترضت أنه في المقام الأول، وراثة object قبل A يخلق نوعا من الغموض في الاسم.هل سيهتم أحد بشرح ما يحدث هنا؟

هل كانت مفيدة؟

المحلول

A ورثت من object أو فئة فرعية من object, ، لا يعمل.يضمن MRO أن تتم زيارة القواعد الموجودة في أقصى اليسار قبل القواعد الموجودة في أقصى اليمين - ولكنه يضمن أيضًا أنه بين الأسلاف إذا كانت x فئة فرعية من y، فسيتم زيارة x قبل y.ومن المستحيل تلبية هذين الضمانين في هذه الحالة

وهنا سؤال مماثل

بايثون:مشكلة مع metaclasses بالتزامن مع الميراث المتعدد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top