2012-03-23 3 views
18

Я немного смущен тем, как передаются аргументы между подклассами и суперклассами в Python. Рассмотрим следующую структуру класса:Подкласс - Аргументы из суперкласса

class Superclass(object): 
    def __init__(self, arg1, arg2, arg3): 
     #Inilitize some variables 
     #Call some methods 

class Subclass(Superclass): 
    def __init__(self): 
     super(Subclass, self).__init__() 
     #Call a subclass only method 

Где у меня возникают проблемы в понимании, как аргументы передаются между суперкласса и подклассов. Нужно ли перерегистрировать все аргументы Superclass в инициализаторе подкласса? Где будут указаны новые, только подклассы, аргументы? Когда я пытаюсь использовать приведенный выше код для создания подкласса, он ожидает только 1 аргумент, а не исходный 4 (включая я), который я перечислял.

TypeError: __init__() takes exactly 1 argument (4 given) 
+1

Обратите внимание, что 'принимает ровно 1 аргумент' может быть запутанным, потому что этот аргумент' self' (который автоматически передается). – katrielalex

ответ

17

Не существует волшебства! __init__ методы работают так же, как и все остальные. Вам нужно явно принять все необходимые аргументы в инициализаторе подкласса и передать их суперклассу.

class Superclass(object): 
    def __init__(self, arg1, arg2, arg3): 
     #Initialise some variables 
     #Call some methods 

class Subclass(Superclass): 
    def __init__(self, subclass_arg1, *args, **kwargs): 
     super(Subclass, self).__init__(*args, **kwargs) 
     #Call a subclass only method 

При вызове Subclass(arg1, arg2, arg3) Python будет просто позвонить Subclass.__init__(<the instance>, arg1, arg2, arg3). Он не будет волшебным образом пытаться сопоставить некоторые аргументы суперкласса, а некоторые - с подклассом.

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