Обзор
У меня есть структура наследования классов Python, в которой большинство методов определены в базовом классе, а большинство атрибутов, на которые основаны эти методы, определены в дочерних классах.
Базовый классвыглядит примерно так:
class Base(object):
__metaclass__ = ABCMeta
@abstractproperty
def property1(self):
pass
@abstractproperty
def property2(self):
pass
def method1(self):
print(self.property1)
def method2(self, val):
return self.property2(val)
, тогда как дочерний класс выглядит так:
class Child(Base):
property1 = 'text'
property2 = function
, где function
- это функция, которая выглядит следующим образом:
def function(val):
return val + 1
Очевидно, что в приведенном выше коде отсутствуют детали, но структура отражает структуру моего реального кода.
Проблема
Когда я пытаюсь использовать method1
в базовом классе, все работает как положено:
>>> child = Child()
>>> child.method1()
'text'
Однако, пытаясь сделать то же самое для method2
спитовошибка:
>>> child = Child()
>>> child.method2(1) # expected 2
TypeError: method2() takes exactly 1 argument (2 given)
Второй передаваемый аргумент - это сам класс Child
.
Мне интересно, есть ли способ избежать передачи этого второго Child
параметра при вызове method2
.
Попытки
Один из найденных мной обходных путей:определите абстрактный метод в базовом классе, а затем создайте эту функцию в дочерних классах следующим образом:
class Base(object):
__metaclass__ = ABCMeta
@abstractproperty
def property1(self):
pass
@abstractmethod
def method2(self, val):
pass
def method1(self):
print(self.property1)
class Child(Base):
property1 = 'text'
def method2(self, val):
return function(val)
Однако я бы предпочел, чтобы этот метод жил в базовом классе.Какие-нибудь мысли?Заранее спасибо!