2013-12-23 2 views
0

Я немного смущен относительно использования __init__ и наследования и хотел бы получить некоторую помощь.Использование __init__ и наследования в python

У меня есть класс [который не может быть изменен]:

class A(object): 
    def __init__(self, param1 = 7, param2 = 10): 
     self.x = param1 
     self.y = param2  
    def func1(self): 
     op1() 
     op2() 
    def func2(self): 
     pass 

это какой-то класс, который был написан и я использую его при перегрузке его функции:

class B(A): 
    def func1(self) 
     op3() 
     op4() 
    def func2(self) 
     op5() 

Моя проблема начинается здесь: Я хочу использовать Class B несколько раз и отправлять каждый раз различные параметры:

---new .py file: --- 
def myFunction(): 
    myInstance = B() 

Я хочу сделать что-то вроде:

def myFunction(): 
    myInstance = B(40,"test") 

Я думал, добавив к классу B - __init__, но проблема в том, что теперь я не уверен, что self было бы использовать: объяснение: Внутри B класса я перегружен func2(self) я думал писание:

class B(A): 
    def __init__(self, paramNumber, paramString) 
     self.paramNumber = paramNumber 
     self.paramString = paramString 

но теперь в func2(self), какая self используется? новый? Старый? это будет работать? Значение у меня будет: self.x , self.y and self.paramNumber self.parmString ? они разные "selfs"

Редактирование: Должен ли я использовать супер?

class B(A): 
    def __init__(self, paramNumber, paramString,param1, param2) 
     self.paramNumber = paramNumber 
     self.paramString = paramString 
     super(B,self).__init__(param1,param2) 

    def myFunction(): 
     myInstance = B(40,"test") 
     // I will get : self.x = 7 
     // self.y= 10 
     // self.paramNumber=40 
     //self.paramString = "test" 

Это правильное решение?

+0

они одинаковы 'self', но вы забыли назвать' .__ init__' создать '.x 'и' .y' – Eric

+0

Не называйте 'A .__ init__' непосредственно, как упоминает Эрик. Используйте [super] (http://docs.python.org/2/library/functions.html#super). – wim

+0

так что подождите - мне нужно добавить в свой «def __init __ (self, paramNumber, paramString) после установки этой инициализации, также супер ?? – user1386966

ответ

3

Так в основном вы хотите запустить __init__ из родительского класса внутри ребенка:

class B(A): 
    def __init__(self, paramNumber, paramString): 
     super(B, self).__init__(param1=1, param2=2) 
     # the other code goes here 
+0

Я сначала использую super, а затем добавляю seld.paramString и self.paramNumber? Я отредактировал свой вопрос, на что я надеюсь, это правильно - не так ли? – user1386966

+0

@ user1386966 От этого зависит порядок. Просто взгляните на код и выясните его. Иногда вы хотите запускать супер в начале, иногда в конце. Я полагаю, что в вашем случае это будет в начале. – freakish

Смежные вопросы