Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用子类对象调用父类的重写方法_Python - Fatal编程技术网

在python中使用子类对象调用父类的重写方法

在python中使用子类对象调用父类的重写方法,python,Python,我在一次采访中提出了这个问题: class Parent(object): def A(self): print "in A" class Child(Parent): def A(self): print "in B" C=Child() 问题: 是否有任何方法可以仅在实例级别使用子对象调用父类函数A,而无需对类进行任何更改 搜索了很多问题,但没有找到满意的答案。请回复 谢谢。显式调用类上的方法 Parent.A(C) 显式调用类上的方法 P

我在一次采访中提出了这个问题:

class Parent(object):
    def A(self):
        print "in A"
class Child(Parent):
    def A(self):
       print "in B"

C=Child()
问题:

是否有任何方法可以仅在实例级别使用子对象调用父类函数
A
,而无需对类进行任何更改

搜索了很多问题,但没有找到满意的答案。请回复


谢谢。

显式调用类上的方法

Parent.A(C)

显式调用类上的方法

Parent.A(C)
你可以使用内置的

它通常用于在子类内部调用超类实现,但也允许在外部调用。文件说明:

还要注意,super()不限于在方法内部使用。两个 参数形式精确指定参数,并使 适当的参考资料

你可以使用内置的

它通常用于在子类内部调用超类实现,但也允许在外部调用。文件说明:

还要注意,super()不限于在方法内部使用。两个 参数形式精确指定参数,并使 适当的参考资料


如您所见,对象的方法始终具有
self
参数

可以将对象作为方法调用

C.A()
或等效地,通过显式传递
self
参数,如下所示:

Child.A(C)
在第二种方法中,还可以使用
C
实例调用父类的方法:

Parent.A(C)
如果您正在寻找解决此问题的通用方法(即不知道父类的名称),则可以使用和:

但是,
super()
有一个很好的附加参数来指定对象实例,因此您还可以编写:

super(type(C), C).A()

如您所见,对象的方法始终具有
self
参数

可以将对象作为方法调用

C.A()
或等效地,通过显式传递
self
参数,如下所示:

Child.A(C)
在第二种方法中,还可以使用
C
实例调用父类的方法:

Parent.A(C)
如果您正在寻找解决此问题的通用方法(即不知道父类的名称),则可以使用和:

但是,
super()
有一个很好的附加参数来指定对象实例,因此您还可以编写:

super(type(C), C).A()

使用
super
调用传递子类的
type
和所需的实例对象,即
C

super(type(C), C).A() # of the form super(class, obj) where class == Child and obj == C

使用
super
调用传递子类的
type
和所需的实例对象,即
C

super(type(C), C).A() # of the form super(class, obj) where class == Child and obj == C

有了实例
C
,我们可以得到它的基类并调用它的
A()


C.\uu类.\uu基.\uu基A()

拥有实例
C
我们可以得到它的基类并调用它的
A()


C.\uu class\uuu.\uu base\uuu().A()

不,它将调用父类方法A而不是被重写的B。不,它将调用父类方法A而不是被重写的B。或者
super(C.\uu class\uuu,C)。A()
而不需要类名硬编码或
super(C.\uu class\uu,C)。A()
而不需要类名硬编码