Почему конструкторы действительно называются «конструкторами»?
Конструктор (названный __new__) создает и возвращает новый экземпляр класса. Таким образом, C.__new__метод класса является конструктором класса C.
Метод C.__init__экземпляра вызывается в конкретном экземпляре после его создания для его инициализации перед передачей обратно вызывающей стороне. Таким образом, этот метод является инициализатором для новых экземпляров C.
Чем они отличаются от методов в классе?
Как указано в официальной документации, __init__ вызывается после создания экземпляра . Другими методами такое лечение не проводится.
Какова их цель?
Цель конструктора C.__new__- определить настраиваемое поведение во время создания нового Cэкземпляра.
Цель инициализатора C.__init__- определить индивидуальную инициализацию каждого экземпляра Cпосле его создания.
Например, Python позволяет делать:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
Но если вы хотите, чтобы каждый экземпляр Testимел атрибут, xравный 10, вы можете поместить этот код внутрь __init__:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
Каждый метод экземпляра (метод, вызываемый конкретным экземпляром класса) получает экземпляр в качестве своего первого аргумента. Этот аргумент называется условно self.
Методы класса, такие как конструктор __new__, вместо этого получают класс в качестве первого аргумента.
Теперь, если вам нужны настраиваемые значения для xатрибута, все, что вам нужно сделать, это передать это значение в качестве аргумента в __init__:
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
Надеюсь, это поможет вам развеять некоторые сомнения, и, поскольку вы уже получили хорошие ответы на другие вопросы, я остановлюсь здесь :)
__init__это инициализатор . Питон конструктор является__new__. Python использует автоматическую двухфазную инициализацию -__new__возвращает действительный, но (обычно) незаселенный объект (см.boolКонтрпример), который затем__init__автоматически вызывает его. Это позволяет избежать проблем, которые возникают в таких языках, как C ++, с частично сконструированными объектами - в Python их никогда не бывает (хотя он может быть частично инициализирован). Вам почти никогда не понадобится переопределять и то,__new__и другое__init__в классе.