خطأ في ترتيب حل الطريقة
-
12-12-2019 - |
سؤال
هذه مسألة فضول أكثر من كونها قضية جدية:
كنت أتلاعب بالميراث المتعدد وصادفت هذا:
>>> 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.ومن المستحيل تلبية هذين الضمانين في هذه الحالة
وهنا سؤال مماثل
لا تنتمي إلى StackOverflow