从派生类对象python调用基类的方法

从派生类对象python调用基类的方法,python,oop,multiple-inheritance,Python,Oop,Multiple Inheritance,我有两个同名的类和方法。我有派生类的对象。当我从派生类对象调用方法(foo)时,它应该调用基类方法 class A: def foo(self): print "A Foo" class B(A): def foo(self): print "B Foo" b = B() b.foo() # "B Foo" 在做了一些搜索之后,我得到了一些如下的解决方案,但不确定这是否是正确的方法 a = A() b.__class__.__bases__[

我有两个同名的类和方法。我有派生类的对象。当我从派生类对象调用方法(foo)时,它应该调用基类方法

class A:
    def foo(self):
        print "A Foo"

class B(A):
    def foo(self):
        print "B Foo"

b = B()
b.foo() # "B Foo"
在做了一些搜索之后,我得到了一些如下的解决方案,但不确定这是否是正确的方法

a = A()
b.__class__.__bases__[0].foo(a) # A Foo

有更好的方法吗。

如果您使用的是Python 3,请使用
super

class A:
    def talk(self):
        print('Hi from A-land!')

class B(A):
    def talk(self):
        print('Hello from B-land!')

    def pass_message(self):
        super().talk()

b = B()
b.talk()
b.pass_message()
class B(A):
    def talk(self):
        print('Hello from B-land!')

    def pass_message(self):
        super(B, self).talk()

b = B()
b.talk()
b.pass_message()
输出:

Hello from B-land!
Hi from A-land!
Hello from B-land!
Hi from A-land!
Hi from A-land!
Hello from B-land!
如果从
object
继承并指定
super
的参数,则可以在Python 2中执行相同的操作:

class A:
    def talk(self):
        print('Hi from A-land!')

class B(A):
    def talk(self):
        print('Hello from B-land!')

    def pass_message(self):
        super().talk()

b = B()
b.talk()
b.pass_message()
class B(A):
    def talk(self):
        print('Hello from B-land!')

    def pass_message(self):
        super(B, self).talk()

b = B()
b.talk()
b.pass_message()
输出:

Hello from B-land!
Hi from A-land!
Hello from B-land!
Hi from A-land!
Hi from A-land!
Hello from B-land!
您还可以调用该方法,就像调用自由函数一样:

A.talk(b)
B.talk(b)  # the same as b.talk()
输出:

Hello from B-land!
Hi from A-land!
Hello from B-land!
Hi from A-land!
Hi from A-land!
Hello from B-land!

当您从派生类对象调用方法(foo)时,它不会调用基类方法,因为您正在覆盖它。您可以为基类或派生类使用另一个方法名来解决干扰。

您应该升级到Python 3。如果您必须使用Python2,
A
应该继承自
object
,使其成为一个新样式的类(其中“new”表示Python2.2及以上版本,或者大约有17年历史!),那么您可以使用
super
。谢谢您的回答。我在派生类和基类中有多个同名的方法。根据场景,我需要调用A或B的方法。@Gopi:听起来你选择了一个糟糕的设计,你应该重新设计它。@user2357112你是对的。处理遗留问题:(@Gopi这与我的答案有什么关系?@gmds我在这里的意思是,我在子类中重写了多个方法。我无法创建像
pass\u message
这样的方法来让所有人调用基类方法。