2016-06-16 2 views
0

Я новичок в классах Python и пытаюсь понять концепцию наследования. У меня есть класс под названием Math, который наследуется от Calc. От Math.product() Я пытаюсь вызвать метод базового класса mul(), как показано ниже:Проблема, вызывающая метод для родительского класса

class Calc(object): 
    def mul(a, b): 
     return a * b 

class Math(Calc): 
    def product(self, a, b): 
     return super(Math, self).mul(a, b) 

if __name__ == "__main__": 
    m = Math() 
    print "Product:", m.product(1.3, 4.6) 

Когда я запускаю код я получаю ошибку ниже, но, насколько я могу сказать, я только прошел два аргумента для mul() в Math.product(a,b). Может кто-то пролить свет на то, какую ошибку я совершил?

Product: 
Traceback (most recent call last): 
File "inheritance.py", line 14, in <module> 
print "Product:", m.product(1.3, 4.6) 
File "inheritance.py", line 9, in product 
return super(Math, self).mul(a, b) 
TypeError: mul() takes exactly 2 arguments (3 given) 
+3

Нет необходимости в том, чтобы быть в классах, вы могли бы просто «с помощью import mul» и сделать с ним! – jonrsharpe

ответ

8

Вам необходимо включить self в качестве параметра в

class Calc(object): 
    def mul(a, b): 
     return a * b 

Либо это, либо использовать staticmethod декоратора.

Например:

class Calc(object): 
    @staticmethod 
    def mul(a, b): 
     return a * b 

Прямо сейчас, когда вы звоните super(Math, self).mul(a, b) Он проходит в следующих аргументов в порядке, self, a, b. Каждый раз, когда вы вызываете метод класса (метод dot), он неявно пропускает self в качестве первого параметра.

Декоратор staticmethod сообщает функции, что он не работает на конкретном экземпляре класса, поэтому нет необходимости передавать его в self.

+0

Это круто .. Оба решения работали как шарм. @staticmethod decorator - самый предпочтительный способ сделать это, я думаю, не так ли? –

+1

Да, если функция не использует какие-либо свойства класса, на который он вызывается, 'staticmethod' делает его наиболее читаемым. –

+0

Мне нравится htis как ответ, и OP также делает: Awsome! ... но я надеюсь, что метод 'mul', прикрепленный или помещенный в пространство имен класса' Calc', имеет нечто более специфическое, которое было отредактировано для SO, иначе я бы пошел с комментарием @jonrsharpe (на вопрос) ;-) – Dilettant