A class
объект - это просто экземпляр еще одного типа, обычно type
(хотя вы можете изменить его с помощью параметра metaclass
на оператор class
).
Как и большинство других экземпляры, вы можете в любое время добавить произвольные атрибуты экземпляра к объекту class
.
Атрибуты класса и атрибуты экземпляра полностью разделены; первые хранятся в объекте class
, последние - в экземплярах класса.
В __init__
нет ничего особенного; это просто еще один метод, который, помимо прочего, может присоединять новые атрибуты к объекту. Особенность заключается в том, что __init__
автоматически вызывается , когда вы создаете новый экземпляр класса путем вызова класса. foo = MyClass(2)
эквивалентно
foo = MyClass.__new__(MyClass, 2)
foo.__init__(2)
Оператор класса
class MyClass(object):
class_var = 1
def __init__(self, i_var):
self.i_var = i_var
примерно эквивалентен
def my_class_init(self, i_var):
self.i_var = i_var
MyClass = type('MyClass', (object,), {'class_var': 1, '__init__: my_class_init})
Форма с тремя аргументами type
позволяет вы передаете dict
, который создает атрибуты класса при первом создании класса, но вы всегда можете также присвоить атрибуты и после факта:
MyClass = type('MyClass', (object,), {})
MyClass.class_var = 1
MyClass.__init__ = my_class_init
Просто чтобы поразить вас немного немного больше, вызов type
может быть как
MyClass = type.__new__(type, 'MyClass', (object,), {...})
MyClass.__init__('MyClass', (object,), {...})
, хотя, если вы не определите пользовательский метакласс (подклассом type
), вам никогда не придется думать о type
сам имеет методы __new__
и __init__
.