Почему конструкторы действительно называются «Конструкторы»?
Потому что __init__
строит ваш объект.
Как они отличаются от методов в классе?
Как указано в official documentation__init__
является вызывается при создании экземпляра, другие методы не получают это лечение.
Какова их цель?
Цель состоит в том, чтобы вы могли построить свой объект по своему желанию во время создания.
Например 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
«Я» - это стандартное слово, используемое как первый аргумент функции метода, это первый аргумент - экземпляр объекта (за исключением class/static-способами), в нашем случае t
.
Теперь, если вы хотите пользовательские значения для x
приписывать все, что вам нужно сделать, это передать это значение в качестве аргумента __init__
:
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
Я надеюсь, что это поможет прояснить некоторые сомнения, и так как вы» ve уже получил хорошие ответы на другие вопросы, которые я остановлюсь здесь :)
Технически, '__init__' является * инициализатором *. Конструктор python * - '__new__'. Python использует автоматическую двухфазную инициализацию - '__new__' возвращает действительный, но (обычно) непосещенный объект (см.' Bool' для встречного примера), который затем '__init__' вызывал его автоматически. Это позволяет избежать проблем с такими языками, как C++, с частично сконструированными объектами - в Python у вас их никогда не было (хотя оно может быть частично инициализировано). Вам почти никогда не придется переопределять как '__new__', так и' __init__' в классе. –
@TimDelaney: Я не уверен, что вы имеете в виду с частично построенными объектами в C++. –
@phresnel В C++ тип объекта - это базовый класс (а не подкласс), а в конструкторе базового класса. Вы не можете вызвать виртуальный метод в конструкторе базового класса и предоставить подкласс для реализации. В Java вы можете вызвать метод подкласса в конструкторе базового класса, но переменные-члены подкласса автоматически инициализируются * после * конструктора базового класса (и вызова метода). В языках с двухфазной инициализацией, такой как Python, вы можете с радостью вызывать методы в инициализаторе базового класса и иметь подкласс, обеспечивающий (или переопределяющий) поведение. –