You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:40:24