Наследование может быть очень гибким понятием в Python.Для начала вы всегда должны использовать новые классы стилей.Для этого убедитесь, что ваши классы всегда наследуются от «объекта».
Важно отметить, что классы должны наследовать от других классов, а не экземпляров других классов, поэтому ваш пример действительно не сработает там.На самом деле, я не вижу разницы между наследованием от X или x1.
Наследование в python тесно связано с «Порядком разрешения методов» (MRO).Вы можете просматривать объекты MRO с помощью модуля проверки.
>>> import inspect
>>> import pprint
>>>
>>> class X(object):
... pass
...
>>> class Y(X):
... pass
...
>>>
>>> pprint.pprint(inspect.getmro(Y))
(<class '__main__.Y'>, <class '__main__.X'>, <type 'object'>)
>>>
Кортеж в конце показывает порядок, в котором python будет пытаться разрешать вызовы методов и атрибутов.Вы можете изменить MRO во время выполнения, изменив атрибут __bases__
класса.
>>> Y.__bases__
(<class '__main__.X'>,)
>>>
>>> class Z(object):
... pass
...
>>> Y.__bases__ = tuple([Z])
>>> pprint.pprint(inspect.getmro(Y))
(<class '__main__.Y'>, <class '__main__.Z'>, <type 'object'>)
>>>
Это может осложниться, если какой-либо из ваших классов использует множественное наследование или если вы хотите сохранить определенные части дерева наследования.но не другие.