Python: как различать унаследованные методы - PullRequest
4 голосов
/ 07 октября 2010

Вопрос новичка Python. У меня есть класс, который наследует от нескольких классов, и некоторые из классов специализации переопределяют некоторые методы из базового класса. В некоторых случаях я хочу вызвать неспециализированный метод. Это возможно? Если да, какой синтаксис?

class Base(object):
    def Foo(self):
        print "Base.Foo"

    def Bar(self):
        self.Foo()  # Can I force this to call Base.Foo even if Foo has an override?


class Mixin(object):
    def Foo(self):
        print "Mixin.Foo"


class Composite(Mixin, Base):
    pass


x = Composite()
x.Foo()  # executes Mixin.Foo, perfect
x.Bar()  # indirectly executes Mixin.Foo, but I want Base.Foo

1 Ответ

6 голосов
/ 07 октября 2010

Вы можете сделать нужный звонок, используя синтаксис

Base.Foo(self)

в вашем случае:

class Base(object):
    # snipped

    def Bar(self):
        Base.Foo(self)  # this will now call Base.Foo regardless of if a subclass
                        # overrides it

# snipped


x = Composite()
x.Foo()  # executes Mixin.Foo, perfect
x.Bar()  # prints "Base.Foo"

Это работает, потому что Python выполняет вызовы связанных методов вида

instance.method(argument)

как если бы они были вызовом несвязанного метода

Class.method(instance, argument)

поэтому вызов в этой форме дает желаемый результат. Внутри методов self является просто экземпляром, для которого был вызван метод, то есть неявным первым аргументом (это явный параметр)

Обратите внимание, что если подкласс переопределяет Bar, то вы ничего не можете сделать с этим, AFAIK. Но именно так все и работает в python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...