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

为何外部提供的print方法作为类属性调用时未接收self?

为什么直接将print赋值为类属性调用时不会自动传入self?

要搞懂这个问题,得先明确Python里实例方法的绑定逻辑:

  • 当你把用户自定义函数(包括def定义的普通函数、lambda匿名函数)赋值给类属性时,通过实例调用这个函数时,Python会自动把实例对象作为第一个参数传入。这是因为所有用户自定义函数都实现了__get__方法,属于「非数据描述符」,当实例访问这类属性时,会自动完成绑定,把函数包装成实例方法。

我们结合你给出的例子逐一分析:

例子1:自定义普通函数赋值给类属性

def method(self):
    return self.x

class Foo:
    def __init__(self, x):
        self.x = x

    func = method

foo = Foo(5)
foo.func()  # 5

这里的method是用户自定义函数,当foo.func被调用时,Python自动把foo作为self参数传入,所以能正确返回self.x的值。

例子2:lambda函数赋值给类属性

class Foo:
    func = lambda x: print(x)

foo = Foo()
foo.func()  # <__main__.Foo object at 0xdeadbeef>

lambda本质也是用户自定义函数,同样会触发绑定逻辑,调用时自动把foo实例作为x参数传入,所以打印出了实例对象。

例子3:内置print函数赋值给类属性

class Foo:
    func = print

foo = Foo()
foo.func()  # 输出空行

问题核心在于print是内置C实现的函数,它没有实现__get__方法,不属于可绑定的描述符。当你通过foo.func访问它时,Python不会做任何绑定处理,直接返回原始的print函数。这时候调用foo.func()就等同于直接调用print()——没有传入任何参数,自然输出空行,不会自动传入self。


内容的提问来源于stack exchange,提问作者Daniel Walker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 23:12:08