在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python  網(wǎng)絡(luò)安全/ python print函數(shù)的輸出問題

python print函數(shù)的輸出問題

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))

輸出結(jié)果:

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

問題:為什么三個輸出會不相同?
從結(jié)果可知:對象的__str__方法在print時沒有被自行調(diào)用,那么要__str__還有什么用呢?

回答
編輯回答
風(fēng)畔

為什么Foo.fa.f不同?簡單的理解是:Foo.f接受一個參數(shù),而a.f已經(jīng)綁定了Foo.f的第一個參數(shù)是a,所以Foo.fa.f是不同的,a.fFoo.f綁定了參數(shù)的版本,這時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.
2017年1月20日 09:32
編輯回答
撥弦

暫時不清楚為什么三個print的結(jié)果會不一樣,估計是a.f在內(nèi)存中發(fā)生了自動。
至于為什么沒有調(diào)用__str__,因為代碼就沒有要求返回對a的描述,返回的都是對方法f的描述。
輸出中,尖括號內(nèi)“of”后面的內(nèi)容由于是給機器看的,所以調(diào)用的是Foo類的__repr__方法,而不是__str__

2018年3月5日 13:03