python print函数的输出问题

class Foo(object):
    def f(self):
        pass
        
a=Foo()
print(id(Foo.f),id(a.f))
print(a.f,id(Foo.f),id(a.f))
print(str(a.f),id(Foo.f),id(a.f))

输出结果:

2005918566192 2005885408456
<bound method Foo.f of <__main__.Foo object at 0x000001D30A108B00>> 2005918566192 2005885410056
<bound method Foo.f of <__main__.Foo object at 0x000001D30A108B00>> 2005918566192 2005885408456

问题:为什么三个输出会不相同?
从结果可知:对象的__str__方法在print时没有被自行调用,那么要__str__还有什么用呢?

阅读 2.5k
2 个回答

暂时不清楚为什么三个print的结果会不一样,估计是a.f在内存中发生了自动。
至于为什么没有调用__str__,因为代码就没有要求返回对a的描述,返回的都是对方法f的描述。
输出中,尖括号内“of”后面的内容由于是给机器看的,所以调用的是Foo类的__repr__方法,而不是__str__

为什么Foo.fa.f不同?简单的理解是:Foo.f接受一个参数,而a.f已经绑定了Foo.f的第一个参数是a,所以Foo.fa.f是不同的,a.fFoo.f绑定了参数的版本,这时Foo.f == a.f.__func__

官方文档:

When an instance method object is created by retrieving a user-defined function object from a class via one of its instances, its _self_ attribute is the instance, and the method object is said to be bound. The new method’s _func_ attribute is the original function object.
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏