Подтвердить что ты не робот

Метод наследования и базового класса call python

Я хотел бы, чтобы метод в базовом классе вызывал другой метод в том же классе вместо метода переопределения в унаследованном классе. Я хотел бы, чтобы следующий код распечатывал

Класс B: 6

Класс A: 9

Можно ли это сделать?


# Base class definition
class ClassA(object):
    def __init__(self):
        print("Initializing A")

    # hoping that this function is called by this class printFnX
    def fnX(self, x):
        return x**2

    def printFnX(self, x):
        print("ClassA:",self.fnX(x))

# Inherits from ClassA above
class ClassB(ClassA):
    def __init__(self):
        print("initizlizing B")

    def fnX(self, x):
        return 2*x

    def printFnX(self, x):
        print("ClassB:", self.fnX(x))
        ClassA.printFnX(self,x)

bx = ClassB()
bx.printFnX(3)
4b9b3361

Ответ 1

То же самое можно сделать, создав fnX и printFnX оба метода класса.

class ClassA(object):

    def __init__(self):
        print("Initializing A")

    # hoping that this function is called by this class printFnX
    @classmethod
    def fnX(self, x):
        return x ** 2

    @classmethod
    def printFnX(self, x):
        print("ClassA:",self.fnX(x))

class ClassB(ClassA):
    def __init__(self):
        print("initizlizing B")

    def fnX(self, x):
        return 2*x

    def printFnX(self, x):
        print("ClassB:", self.fnX(x))
        ClassA.printFnX(x)


bx = ClassB()<br>
bx.printFnX(3)

Ответ 2

Поздравляем, вы обнаружили мотивирующий пример использования для двунаправленного названия Python: -)

Подробности и выработанный пример см. в разделе http://docs.python.org/tutorial/classes.html#private-variables и http://docs.python.org/reference/expressions.html#atom-identifiers.

Здесь, как использовать его для вашего примера:

# Base class definition
class ClassA(object):
    def __init__(self):
        print("Initializing A")

    # hoping that this function is called by this class printFnX
    def fnX(self, x):
        return x**2
    __fnX = fnX

    def printFnX(self, x):
        print("ClassA:",self.__fnX(x))

# Inherits from ClassA above
class ClassB(ClassA):
    def __init__(self):
        print("initizlizing B")

    def fnX(self, x):
        return 2*x

    def printFnX(self, x):
        print("ClassB:", self.fnX(x))
        ClassA.printFnX(self,x)

bx = ClassB()
bx.printFnX(3)

Вариант использования описывается как способ реализации принципа http://www.youtube.com/watch?v=yrboy25WKGo&noredirect=1.