Как CPython отслеживает тип объекта - PullRequest
0 голосов
/ 14 октября 2018

Я изучаю классы и хотел узнать, как python отслеживает тип объекта.Я мог бы представить, что легко определить тип int, потому что он является встроенным типом

but now suppose, I have the following code: 
class Point:
    def __init__(self, x,y):
        self._x=x
        self._y=y

    def draw(self):
        print(self._x, self._y)
p1=Point(1,2)

Как Python узнает, что этот объект имеет тип p.Я понимаю, что если бы я хотел знать тип p1, я бы назвал type(p1), но мне было интересно, как этот тип представлен в памяти.Я думал, что это атрибут, унаследованный от класса object, который устанавливается при вызове конструктора, но когда я вызываю print(object.__dict__), атрибут типа отсутствует.

Ответы [ 2 ]

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

Я пока не хочу путать вас с метаклассами, поэтому я дам краткое объяснение.Атрибут __class__ объекта возвращает класс этого экземпляра, который вы здесь называете «типом».

p1.__class__

возвращает это.

__main__.Point

__main__модуль и Point - это, очевидно, класс.

Однако есть нечто большее.Классы также являются объектами и при вызове

Point.__class__

Возвращает type, а type является метаклассом в Python.В основном класс класса - это тип.

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

Builit-in dir предоставит вам список допустимых атрибутов для этого объекта.

Ваш пример:

class Point:
    def __init__(self, x,y):
        self._x=x
        self._y=y

    def draw(self):
        print(self._x, self._y)
p1=Point(1,2)

Затем

print(dir(p1))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_x', '_y', 'draw']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...