Python динамически типизируется: имена относятся к объектам без какого-либо представления о типе. У вас просто есть
>>> class Account: pass
...
>>> class SavingsAccount(Account): pass
...
>>> obj = SavingsAccount()
Каждый объект хранит ссылку на свой собственный тип
>>> type(obj)
<class '__main__.SavingsAccount'>
, и каждый тип имеет ссылку на свой порядок разрешения методов (MRO)
>>> type(obj).__mro__
(<class '__main__.SavingsAccount'>, <class '__main__.Account'>, <class 'object'>)
Атрибуты экземпляра не «разделены» в соответствии с классом, который «определяет» их; каждый атрибут просто существует в самом экземпляре, без ссылки на какой-либо конкретный класс.
Методы существуют исключительно в самих классах; когда приходит время для вызова obj.foo()
, MRO используется для определения, чье определение используется.