Принудительное использование функций базового класса из базового класса
Ответ на этот вопрос, вероятно, таков: "Ч-что!? Что за!@#$- Стоп!! Это ужасная идея!", но я хотел бы услышать ваши мысли...
У меня есть два класса, и один наследует от другого.
class A(object):
def t1(self):
self.t2()
def t2(self):
print "A"
class B(A):
def t1(self):
super(B, self).t1()
def t2(self):
print "B"
>>> a = A()
>>> b = B()
>>> a.tl()
A
>>> b.t1()
B
В этом примере B.t1
вызывает super
функция, чтобы позвонить A.t1
, но когда он попадает self.t2()
, в A.t1
функция возвращается к B
класс для выполнения B.t2()
Как я могу заставить звонки из базового класса оставаться в базовом классе? Это все, что я мог придумать, и это работает, но я думаю, что есть лучшее решение.
class A(object):
def t1(self):
if type(self) == A:
self.t2()
else:
super(type(self), self).t2()
def t2(self):
print "A"
class B(A):
def t1(self):
super(B, self).t1()
def t2(self):
print "B"
>>> a = A()
>>> b = B()
>>> a.tl()
A
>>> b.t1()
A
2 ответа
В A
"s t1
ты можешь сделать A.t2(self)
, Однако такой вид установки, вероятно, является показателем хрупкого дизайна.
Вы используете двойное подчеркивание, иначе название искажения.
class A(object):
def t1(self):
self.__t2() # <---- changed the call
def t2(self):
print "A"
__t2 = t2 # private copy of original t2() method
>>> a = A()
>>> b = B()
>>> a.tl()
A
>>> b.t1()
A
Но у искажения имени есть огромное значение по умолчанию: оно делает юнит-тестирование более трудным и уродливым, если функция имеет только двойное подчеркивание в качестве имени.
Но я с @BrenBarn, это похоже на хрупкий дизайн.