Python多态函数执行存疑:继承与方法参数传递问题咨询
Python多态、继承与方法传参疑问解答
问题描述
以下Python多态函数执行后的完整输出哪项描述正确?实际运行得到的输出是否符合预期?另外有两个疑问:Primary类继承自object是否会有影响?能否将类方法作为函数的参数传入?
示例代码
class Primary(object): def show(self): print("Primary class is called") class Secondary(Primary): def show(self): print("Secondary class is called") def result(classmethod): classmethod.show() primaryobj = Primary() secondaryobj = Secondary() result(primaryobj) result(secondaryobj)
实际输出
Primary class is called Secondary class is called
解答
1. 输出正确性
你得到的输出完全正确,这是Python多态的典型表现:result函数接收实例对象后,调用对象的show方法时,会根据对象的实际类型动态选择对应的方法。primaryobj属于Primary类,执行父类的show;secondaryobj属于Secondary类,因为子类重写了show方法,所以执行子类的版本。
2. 继承object的影响
在Python 3中,所有类默认隐式继承自object,显式写class Primary(object):和省略(object)没有任何区别,不会影响多态行为。Python的多态基于实例的动态类型实现,和是否显式声明继承object无关。
3. 类方法作为参数传入
你当前代码里result接收的是实例对象,不是类方法。如果要传入类方法,分两种情况:
- 传入绑定方法:比如直接传
primaryobj.show,此时方法已经和实例绑定,result函数只需调用classmethod()即可执行,无需再传实例 - 传入未绑定方法:比如传
Primary.show,这时候需要手动传入实例作为参数,修改result为:
调用时用def result(classmethod, obj): classmethod(obj)result(Primary.show, primaryobj)
也就是说,类方法确实可以作为参数传入,但要注意绑定状态和调用时的参数要求。
内容的提问来源于stack exchange,提问作者Reactoo
相关产品推荐
相关产品推荐

