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

为何同一类Rectangle中的display_info是未绑定方法对象(Unbound Method Object)而get_num是绑定方法对象(Bound Method Object)?

为何同一类Rectangle中的display_info是未绑定方法对象(Unbound Method Object)而get_num是绑定方法对象(Bound Method Object)?

咱们把这事掰碎了说,核心差异全在装饰器的作用和Python对类中不同函数的处理逻辑上:

  • 先看display_info:它就是Rectangle类里定义的一个普通函数,没有任何装饰器加持。当你通过类名Rectangle.display_info访问它时,Python直接返回这个函数本身——它没有和任何类实例或者类对象绑定在一起。换句话说,你调用它的时候得自己手动传所有需要的参数(如果有的话),Python不会自动帮你把类或者实例作为第一个参数塞进去,所以它是“未绑定”的,输出就是普通的函数对象。

  • 再看get_num:它被@classmethod这个装饰器修饰了。这个装饰器的本职工作就是把方法绑定到类本身。当你通过Rectangle.get_num访问它时,Python会自动把Rectangle这个类对象作为第一个参数(也就是函数里的cls)绑定到这个方法上。所以你看到的输出会明确显示它是“绑定到Rectangle类的方法”,调用的时候直接写Rectangle.get_num()就行,不用手动传cls参数,Python已经帮你搞定了。

再结合你的代码输出对比下:

<function Rectangle.display_info at 0x7f02d97405e0>
<bound method Rectangle.get_num of <class 'main.Rectangle'>>

前者就是普通函数的标识,后者明确标注了是绑定到类的方法。

顺便提一句,在Python 3里其实已经没有“未绑定方法”这个严格的术语了,类里的普通函数就是普通函数,但从输出的区别能直观感受到两种方法的本质差异——装饰器给get_num加了“绑定到类”的buff,而display_info就是个没加buff的普通函数。

备注:内容来源于stack exchange,提问作者Shankar Sen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 11:14:33