Я узнаю о классах и хотел узнать, как 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__)
, атрибут типа отсутствует.
Я пока не хочу путать вас с метаклассами, поэтому я дам краткое объяснение. __class__
объекта возвращает класс этого экземпляра, который вы здесь называете "type".
p1.__class__
возвращает это.
__main__.Point
__main__
- это модуль, а Point
- класс.
Однако есть нечто большее. Классы также являются объектами, и когда вы вызываете
Point.__class__
Он возвращает type
, а type
- это метакласс в Python. В принципе класс класса является типом.
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']
print(p1.__class__)