亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python中的實例變量與類變量

Python中的實例變量與類變量

慕村9548890 2019-10-12 07:07:28
Python中的實例變量與類變量我有Python類,其中我在運行時只需要一個實例,因此每個類只有一次屬性就足夠了,而不是每個實例。如果存在多個實例(不會發生),則所有實例都應具有相同的配置。我想知道以下哪個選項會更好或更“慣用”Python。類變量:class MyController(Controller):   path = "something/"   children = [AController, BController]   def action(self, request):     pass實例變量:class MyController(Controller):   def __init__(self):     self.path = "something/"     self.children = [AController, BController]   def action(self, request):     pass
查看完整描述

3 回答

?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

如果你只有一個實例,那么最好每個實例創建所有變量,只是因為它們會被訪問(一點點)更快(由于從類到實例的“繼承”,一個更少的“查找”級別),并且沒有任何缺點可以衡量這個小優勢。

查看完整回答
反對 回復 2019-10-13
?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

進一步回應邁克和亞歷克斯的建議并添加我自己的顏色......

使用實例屬性是典型的,更慣用的Python。類屬性不常使用 - 至少在我連續13年的Python中沒有生產代碼。對于靜態和類方法也是如此...除非有特定的用例或異常的程序員想要炫耀他們知道Python編程的一些不起眼的角落,否則不是很常見。

alex在他的回復中提到,由于一個較少的查找級別,訪問速度會快一點點...讓我進一步澄清那些不知道它是如何工作的人,它與變量訪問非常相似 - - 按此順序搜索:

  1. 當地人

  2. nonlocals

  3. 全局

  4. 內置插件

對于屬性訪問,順序是:

  1. 由MRO確定的基類(方法解析順序)

在上面的示例中,假設您正在查找path屬性。當遇到像“ self.path” 這樣的引用時,Python會首先查看實例屬性以獲得匹配; 當失敗時,它會檢查從中實例化對象的類。最后,它將搜索基類。正如亞歷克斯所說,如果在實例中找到你的屬性,它就不會順從類,因此節省了一點時間。

但是,如果你堅持使用類屬性,你將不得不放棄這一點性能,或者,你的另一種選擇是通過類而不是實例引用對象,例如,MyController.path而不是self.path。這是一個直接查找,它將繞過延遲查找,但正如alex提到的那樣,這是一個全局變量,所以你會丟失那個你認為要保存的位(除非你創建一個對[global]類名的本地引用)。



查看完整回答
反對 回復 2019-10-13
?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

如有疑問,您可能需要實例屬性。

類屬性最好保留用于有意義的特殊情況。唯一非常常見的用例是方法。對于實例需要知道的只讀常量,使用類屬性并不罕見(盡管這樣做的唯一好處就是如果你也希望從類外部進行訪問),但你應該謹慎地將任何狀態存儲在它們中,這很少是你想要的。即使您只有一個實例,也應該像編寫其他任何實例一樣編寫類,這通常意味著使用實例屬性。


查看完整回答
反對 回復 2019-10-13
  • 3 回答
  • 0 關注
  • 259 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號