инициализатор подкласса Python - PullRequest
2 голосов
/ 13 августа 2010

Допустим, в ООП Python Person является родительским классом со своим собственным инициализатором;затем Student - это подкласс Person, прежде чем я использую Student, должен ли сначала вызываться Person.__init__(self) в инициализаторе Student?Кроме того, я могу определить новый инициализатор в классе Student?

class Person():      
    def __init__(self):  

Выше класс Person с его инициализатором

class Student(Person):    
    def __init__(self):  
        Person.__init__(self)   
    def __init__(self, age)

Что я имею в виду, может ли Student иметь собственный инициализатор?Если это так, должен ли Person.__init__(self) вызываться в инициализаторе Student в этом случае?

Ответы [ 6 ]

8 голосов
/ 13 августа 2010

Конечно, Student может иметь свой собственный инициализатор. Однако класс может иметь только один инициализатор в Python, потому что это специальный метод, вызываемый в конструкторе (метод класса __new__).

Итак, когда мы говорим, что подкласс имеет свой собственный инициализатор, мы действительно имеем в виду что-то вроде этого:

class Worker(People):
    def __init__(self, company):
        self.company = company

Как указал @IanH, вам не нужно вызывать инициализатор суперкласса. И когда вы думаете, что должны вызывать его (возможно, для некоторой общей инициализации), вы можете сделать это так:

class People:
    def __init__(self, name):
        self.name = name

class Student(People):
    def __init__(self, name, school):
        super(Student, self).__init__(name)
        self.school = school
4 голосов
/ 13 августа 2010

Нет, это будет выглядеть так:

class Person(object):
    def __init__(self, name, age, height, weight):
        self.name = name
        self.age = age
        self.height = height
        self.weigth = weight


class Student(Person):
    def __init__(self, name, age, height, weight, school):
        Person.__init__(self, name, age, heigth, weight)
        self.school = school

Если бы у вас не было Person.__init__ в классе Student, вам бы пришлось делать все то, что вы делаете в классе Person в классе Student, если вы хотите использовать его как личность. *

1 голос
/ 13 августа 2010

Student может иметь собственный инициализатор. В Python вы можете или не можете вызывать инициализатор базового класса, но это хорошая практика.

0 голосов
/ 06 марта 2014

Вы можете перегрузить __new__ в Python до __init__, то, что вы искали в исходном вопросе.

def __new__(cls, *args, **kwargs):pass
0 голосов
/ 13 августа 2010

Адаптировано из ответа Zimm3r, но для максимальной корректности используется super:

class Person(object):
    def __init__(self, name, age, height, weight):
        self.name = name
        self.age = age
        self.height = height
        self.weigth = weight


class Student(Person):
    def __init__(self, name, age, height, weight, school):
        super(Student, self).__init__(name, age, heigth, weight)
        self.school = school
0 голосов
/ 13 августа 2010

Это не должно быть, нет, но это действительно должно быть.Если базовый класс имеет какие-либо методы или свойства, которые не переопределены в производном классе, то должен быть вызван инициализатор из базового класса, в противном случае эти методы и свойства могут не работать.

РЕДАКТИРОВАТЬ: позвольте мне уточнить.Вы можете определить инициализатор для Student, но этот инициализатор действительно должен вызвать Person.__init__, чтобы убедиться, что базовый класс инициализирован правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...