Как CPython отслеживает тип объекта

1

Я узнаю о классах и хотел узнать, как 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__), атрибут типа отсутствует.

  • 1
    print(p1.__class__)
Теги:
class
oop

2 ответа

1
Лучший ответ

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

p1.__class__

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

__main__.Point

__main__ - это модуль, а Point - класс.

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

Point.__class__

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

  • 1
    Вам также следует прочитать модель данных Python, чтобы понять, как работает язык Python.
1

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

Ваш пример:

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']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню