3 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊
如果你只有一個(gè)實(shí)例,那么最好每個(gè)實(shí)例創(chuàng)建所有變量,只是因?yàn)樗鼈儠?huì)被訪問(wèn)(一點(diǎn)點(diǎn))更快(由于從類到實(shí)例的“繼承”,一個(gè)更少的“查找”級(jí)別),并且沒(méi)有任何缺點(diǎn)可以衡量這個(gè)小優(yōu)勢(shì)。

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
進(jìn)一步回應(yīng)邁克和亞歷克斯的建議并添加我自己的顏色......
使用實(shí)例屬性是典型的,更慣用的Python。類屬性不常使用 - 至少在我連續(xù)13年的Python中沒(méi)有生產(chǎn)代碼。對(duì)于靜態(tài)和類方法也是如此...除非有特定的用例或異常的程序員想要炫耀他們知道Python編程的一些不起眼的角落,否則不是很常見(jiàn)。
alex在他的回復(fù)中提到,由于一個(gè)較少的查找級(jí)別,訪問(wèn)速度會(huì)快一點(diǎn)點(diǎn)...讓我進(jìn)一步澄清那些不知道它是如何工作的人,它與變量訪問(wèn)非常相似 - - 按此順序搜索:
當(dāng)?shù)厝?/p>
nonlocals
全局
內(nèi)置插件
對(duì)于屬性訪問(wèn),順序是:
例
類
由MRO確定的基類(方法解析順序)
在上面的示例中,假設(shè)您正在查找path
屬性。當(dāng)遇到像“ self.path
” 這樣的引用時(shí),Python會(huì)首先查看實(shí)例屬性以獲得匹配; 當(dāng)失敗時(shí),它會(huì)檢查從中實(shí)例化對(duì)象的類。最后,它將搜索基類。正如亞歷克斯所說(shuō),如果在實(shí)例中找到你的屬性,它就不會(huì)順從類,因此節(jié)省了一點(diǎn)時(shí)間。
但是,如果你堅(jiān)持使用類屬性,你將不得不放棄這一點(diǎn)性能,或者,你的另一種選擇是通過(guò)類而不是實(shí)例引用對(duì)象,例如,MyController.path
而不是self.path
。這是一個(gè)直接查找,它將繞過(guò)延遲查找,但正如alex提到的那樣,這是一個(gè)全局變量,所以你會(huì)丟失那個(gè)你認(rèn)為要保存的位(除非你創(chuàng)建一個(gè)對(duì)[global]類名的本地引用)。

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊
如有疑問(wèn),您可能需要實(shí)例屬性。
類屬性最好保留用于有意義的特殊情況。唯一非常常見(jiàn)的用例是方法。對(duì)于實(shí)例需要知道的只讀常量,使用類屬性并不罕見(jiàn)(盡管這樣做的唯一好處就是如果你也希望從類外部進(jìn)行訪問(wèn)),但你應(yīng)該謹(jǐn)慎地將任何狀態(tài)存儲(chǔ)在它們中,這很少是你想要的。即使您只有一個(gè)實(shí)例,也應(yīng)該像編寫(xiě)其他任何實(shí)例一樣編寫(xiě)類,這通常意味著使用實(shí)例屬性。
添加回答
舉報(bào)