Вопрос по constructor, python-2.7, class, python – Почему конструктор суперкласса не вызывается, когда мы объявляем объект подкласса?

1

Я программист на Java, новичок в программировании на Python. Я заметил неожиданное поведение в программировании на Python. Я ожидал последовательность печати какB class ,A Class Конструкторы. Но это's только исполняющий конструктор.

Вывести как "Его Конструктор "Не могли бы вы помочь мне понять поток выполнения. заранее спасибо

class B:
    def __init__(self):
        print 'Its constructor of B'    

class A(B):
    def __init__(self):
        print 'Its constructor of A'
        #B.__init__(self)

if __name__=='__main__':
    obj=A()
Явное лучше, чем неявное.python.org/dev/peps/pep-0020 Lennart Regebro
Смотрите такжеПонимание методов Python super () и init Lennart Regebro
Тот'Так же, как работает Python. IIRC, даже на Яве, если выЧтобы расширить класс, чей конструктор принимает параметры, вы должны явно вызватьsuper(), Единственная разница в том, что для суперкласса, который непринимать параметры, звонитьsuper() необязателен в Java, тогда как в Python вы должны вызывать его явно. Aya

Ваш Ответ

1   ответ
1

__init__ метод на самом деле называется, - "конструктор" это что-то еще) явно.

Вы можете сделать это так же, как в закомментированной строке. Еще лучше, вы должны использоватьsuper Функция, которая выясняет, какой родитель для вас доступ. Работает только склассы нового стиля хотя (в основном это означает, что корень иерархии классов должен наследовать отobject).

@chepner Ну сравниFoo.__init__ вFoo(), Вы можете сказать, что__init__ на самом деле не выделяет память и что этоновый»Работа, которая отличает его от версии C ++. Но и конструктор в c ++ не выделяет память, он просто получает адрес неинициализированной порции памяти. C ++ просто неМы не можем изменить поведение при распределении. Voo
@Voo: Фраза, которую вы неверно истолковали, просто утверждает, что__init__ получает те же аргументы, что__new__ получено. chepner
@Voo: Извините, но ваше утверждение относительно выражения конструктора неверно. Выражение конструкторавызов в класс " согласноdocs.python.org/2/reference/datamodel.html#basic-customization.__init__ отличается от "конструктор" вы могли бы привыкнуть к c ++ и java, потому что он ничего не создает: экземпляр класса уже присутствует во время его вызова. shylent
@Voo Touché, Эта документация должна быть обновлена. Это возможно осталось от дней до__new__ стало доступно для переопределения. (Следующее утверждение должно быть проверено фактом :) Хотя__init__ всегда был просто инициализатором, в версии 1.x не было явного конструктора на уровне Python, поэтому можно было бы описать, как__init__ работал. chepner

Похожие вопросы