Можно ли переопределять метод родителя с другим набором аргументов (Python 3)?

Python 3:
class Parent(object):
    def method(self, a, b, c):
        return a ** c + b ** c

class Child(Parent):
    def method(self, a, b):
        return super().method(a, b, 3)

p = Parent()
c = Child()
print(p.method(2, 5, 1), c.method(2, 5))


Код работает. Вопрос возник из-за сообщения PyCharm Community Edition 3.4.1:
Signature of method 'Child.method()' does not match signature of base method in class 'Parent'.
This inspection detects inconsistencies in overriding method signatures.


Почему это вызвало предупреждение, где про это почитать?
  • Вопрос задан
  • 5727 просмотров
Решения вопроса 1
kivsiak
@kivsiak
software engineer
Ну на самом деле так делать нельзя. Во представьте себе что ваш потомок используется в коде который умеет работать с предками. К примеру он умеет работать с животными и знает что у каждого животного есть метод кормить(еда, сколько_раз) а тут вы ему скармливаете собаку у которой метод переопределен на кормить(еда).

Ну и собственно почитать можно вот тут https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@bromzh
Drugs-driven development
Если уж стоит такая острая необходимость, то используй *args и/или **kwargs в родителе:
class A(object):
    def foo(self, *args, **kwargs):
        pass

class B(A):
    def foo(self, a, b, c=42):
        pass
Ответ написан
overmes
@overmes
Это очень плохое проектирование классов, так как работая с определенным объектом необходимо помнить какого этот объект класса
Ответ написан
Комментировать
abukin
@abukin
Программирую на Python
Подумайте деиствительно ли вам нужны аж целых 2 класса для 1 метода?
Или проще сделать функцию в 2 строчки вместо 6.

def method(a, b, c=3):
    return a ** c + b ** c

print(method(2, 5, 1), method(2, 5))


Или может тут вообще ненужно наследование?

class Parent(object):
    def method(self, a, b, c):
        return a ** c + b ** c

class Child():
    def method(self, a, b):
        return Parent.method(a, b, 3)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы