为何外部提供的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
相关产品推荐
相关产品推荐

