2010-08-12 4 views
1

В python OOP, скажем, Person является родительским классом со своим собственным конструктором; то Student является подклассом Person, прежде чем я буду использовать Student, необходимо, чтобы Person.__init__(self) был вызван первым в конструкторе Student? Плюс, могу ли я определить новый конструктор в классе Student?python sub class constructor

class Person():  
    def __init__(self): 

Выше класс Person с конструктором

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

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

ответ

0

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

EDIT: уточню. Вы можете определить конструктор для Student, но этот конструктор действительно должен позвонить Person.__init__, чтобы убедиться, что базовый класс инициализирован правильно.

1

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

+0

@lanH спасибо !! – ladyfafa

1

Нет, это будет выглядеть следующим образом:

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, если вы хотел иметь возможность использовать его как человека.

+0

Я вижу сейчас, спасибо :) – ladyfafa

+0

@sth, btw, могу я знать, как отредактировать код в хороший формат, когда я попытался опубликовать любой фрагмент кода здесь? Ваш код выглядит неплохо. – ladyfafa

+0

ladyfafa: просто нарисуйте строки кода на 4 пробела (+ пробелы для кода python) и Stackoverflow автоматически раскрасит его. – IanH

0

Адаптированный ответ 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

супер работает отлично, точно так же, как java – ladyfafa

5

Конечно, Student может иметь свой собственный конструктор. Тем не менее, класс может иметь только один конструктор в Python, ничего подобного перегрузка конструктора.

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

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 
+0

, что может быть блестящим, моя забота - это так называемая «перегрузка конструктора» », теперь я нахожусь на своем пути – ladyfafa

+0

Это правильный способ сделать это, но узнать больше о том, что' super() 'действительно делает здесь: http://fuhm.net/super-harmful/. Это хорошо читается в более общем смысле, так как точка использования ** kwargs и параметров ключевых слов полезна во многих ситуациях. – clacke

+0

Спасибо, что поделились этой ссылкой. Но если я правильно понял это сочинение, это зло, только когда вы пытаетесь использовать множественное наследство, верно? Так что я считаю, что это многонаправленное вредоносное :) – satoru

0

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

def __new__(cls, *args, **kwargs):pass