Python: показать наследование типов - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь заглянуть под капот в бездействии, чтобы обернуть голову вокруг пользовательских классов Python и того, как они хранятся в памяти.Предположим, у меня есть следующий код:

class Point: 
    pass
x=Point()
print(x)

Учитывая следующий вывод:

<__main__.Point object at 0x000002A3A071DF60>

Я знаю, что мой класс состоит избез кода, когда я создаю объект типа Point, неявно создается объект типа object, от которого Point объект x наследует такие методы, как __str__ и т. д. Однако я не могу видетьсоединение т.е.когда я набираю dir(x), я не вижу никаких атрибутов, в которых хранится ссылка на объект типа object.Я неправильно понимаю, как это работает или есть какой-то атрибут, о котором я не знаю?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

возможно, вы ищете Point.__mro__? порядок разрешения методов класса Point.он говорит вам, в каком порядке python будет искать методы, если вы вызовете x.method.в вашем случае это будет:

print(Point.__mro__)  # or Point.mro()
# (<class '__main__.Point'>, <class 'object'>)
0 голосов
/ 23 октября 2018

Не задействован (прямой) экземпляр типа object.Когда вы вызываете Point(), создается экземпляр Point, и ничего больше.Наследование - это механизм, который работает с классами , а не с экземплярами .

. У объектов Python есть два свойства: их тип и их значение .Тип из x равен Point.Значение из x представляется его __dict__, который является пустым (поскольку не имеет атрибутов):

>>> type(x)
<class '__main__.Point'>
>>> x.__dict__
{}

Нет ссылки на экземпляр objectпотому что такого экземпляра не существует.Наследование от object проявляется в классе Point:

>>> Point.__base__
<class 'object'>
>>> Point.mro()
[<class '__main__.Point'>, <class 'object'>]

Так что причина, по которой x может использовать object методы, заключается в том, что Point наследуется от object, а не потому, что в x хранится скрытый экземпляр object.Вы можете видеть, что Point имеет доступ ко всем object методам:

>>> Point.__str__ is object.__str__
True
>>> Point.__init__ is object.__init__
True
# etc...

Таким образом, по доверенности, x имеет доступ ко всем object методам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...