Python:如何区分继承的方法

时间:2010-10-07 13:30:17

标签: python oop inheritance

新手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 个答案:

答案 0 :(得分:6)

您可以使用语法

专门拨打电话
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中的工作方式。