Принудительное использование функций базового класса из базового класса

Ответ на этот вопрос, вероятно, таков: "Ч-что!? Что за!@#$- Стоп!! Это ужасная идея!", но я хотел бы услышать ваши мысли...

У меня есть два класса, и один наследует от другого.

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, это похоже на хрупкий дизайн.

Другие вопросы по тегам