Почему конструкторы действительно называются «конструкторами»? Какова их цель и чем они отличаются от методов в классе?
Кроме того, может быть __init__
в классе больше одного ? Я пробовал следующее, может кто-нибудь объяснить результат?
>>> class test:
def __init__(self):
print "init 1"
def __init__(self):
print "init 2"
>>> s=test()
init 2
Наконец, есть __init__
ли перегрузчик операторов?
__init__
это инициализатор . Питон конструктор является__new__
. Python использует автоматическую двухфазную инициализацию -__new__
возвращает действительный, но (обычно) незаселенный объект (см.bool
Контрпример), который затем__init__
автоматически вызывает его. Это позволяет избежать проблем, которые возникают в таких языках, как C ++, с частично сконструированными объектами - в Python их никогда не бывает (хотя он может быть частично инициализирован). Вам почти никогда не понадобится переопределять и то,__new__
и другое__init__
в классе.Ответы:
В Python нет перегрузки функций, что означает, что у вас не может быть нескольких функций с одним и тем же именем, но с разными аргументами.
В вашем примере кода вы не перегружаете
__init__()
. Что происходит, так это то, что второе определение повторно связывает имя__init__
с новым методом, делая первый метод недоступным.Что касается вашего общего вопроса о конструкторах, то Википедия - хорошая отправная точка. Для материалов, относящихся к Python, я настоятельно рекомендую документы Python .
источник
__init__
будет то, что закончится в классе.Почему конструкторы действительно называются «конструкторами»?
Конструктор (названный
__new__
) создает и возвращает новый экземпляр класса. Таким образом,C.__new__
метод класса является конструктором класса C.Метод
C.__init__
экземпляра вызывается в конкретном экземпляре после его создания для его инициализации перед передачей обратно вызывающей стороне. Таким образом, этот метод является инициализатором для новых экземпляров C.Чем они отличаются от методов в классе?
Как указано в официальной документации,
__init__
вызывается после создания экземпляра . Другими методами такое лечение не проводится.Какова их цель?
Цель конструктора
C.__new__
- определить настраиваемое поведение во время создания новогоC
экземпляра.Цель инициализатора
C.__init__
- определить индивидуальную инициализацию каждого экземпляраC
после его создания.Например, Python позволяет делать:
Но если вы хотите, чтобы каждый экземпляр
Test
имел атрибут,x
равный 10, вы можете поместить этот код внутрь__init__
:Каждый метод экземпляра (метод, вызываемый конкретным экземпляром класса) получает экземпляр в качестве своего первого аргумента. Этот аргумент называется условно
self
.Методы класса, такие как конструктор
__new__
, вместо этого получают класс в качестве первого аргумента.Теперь, если вам нужны настраиваемые значения для
x
атрибута, все, что вам нужно сделать, это передать это значение в качестве аргумента в__init__
:Надеюсь, это поможет вам развеять некоторые сомнения, и, поскольку вы уже получили хорошие ответы на другие вопросы, я остановлюсь здесь :)
источник
Классы - это просто чертежи для создания объектов. Конструктор - это код, который запускается каждый раз, когда вы создаете объект. Поэтому иметь два конструктора не имеет смысла. Что происходит, так это то, что второй записывает больше первого.
Обычно вы их используете для создания переменных для этого объекта, например:
Итак, что вы могли бы сделать, так это создать объект из этого класса следующим образом:
После этого у testobject будет объект с именем,
some_value
который в этом примере будет 5.Но вам не нужно устанавливать значение для каждого объекта, как я сделал в моем примере. Вы также можете сделать так:
тогда значение some_value будет 5, и вам не нужно устанавливать его при создании объекта.
the >>> и ... в моем примере это не то, что вы пишете. Вот как бы это выглядело в pyshell ...
источник
коонструкторы вызываются автоматически, когда вы создаете новый объект, тем самым «конструируя» объект. Причина, по которой у вас может быть более одного init, заключается в том, что имена являются просто ссылками в python, и вам разрешено изменять то, что каждая переменная ссылается, когда захотите (отсюда динамическая типизация)
в определении вашего класса он просто сохраняет более поздний
источник
В Python нет понятия о перегрузке методов. Но вы можете добиться аналогичного эффекта, указав необязательные аргументы и аргументы ключевого слова.
источник