Python и Java различны.
В Java расширяющий класс всегда должен вызывать родительский конструктор. Чтобы упростить жизнь, если родительский конструктор не имеет аргументов, он будет вызван первым автоматически. Теперь, если вы добавите аргумент в конструктор Java Parent
следующим образом:
Parent (int i) {
System.out.println("In the parent class constructor | " + this);
}
вы обнаружите следующую ошибку компиляции:
There is no default constructor available in 'org.example.Parent'
Это имеет смысл , при построении Child Java не знает, что передать в качестве значения i
. Поэтому мы должны вручную вызвать конструктор Parent:
Child () {
super(1);
System.out.println("I the child class constructor | " + this);
}
Python менее строг. По-прежнему рекомендуется всегда вызывать родительский конструктор, но Python не требует от вас этого. Это потому, что Python не является типобезопасным .
Теперь давайте посмотрим, что произойдет, если вы забудете вызвать родительский конструктор:
class Parent:
def __init__(self):
self.i = 1
print(f"I am the constructor of parent {self}")
def printi(self):
print(self.i)
class Child(Parent):
def __init__(self):
pass
ch = Child()
ch.printi()
Неустранимая ошибка происходит:
Traceback (most recent call last):
File "test.py", line 15, in <module>
ch.printi()
File "test.py", line 7, in printi
print(self.i)
AttributeError: 'Child' object has no attribute 'i'
Чтобы исправить этот код, вы можете добавить следующую строку в функцию Child init :
Parent.__init__(self)
Как вы заметили, класс Parent был все еще создан (потому что вы могли бы вызвать метод function
. Это снова, потому что Python менее строг. В python объект может быть создан без вызова конструктора.