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

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

何時以及如何在python中使用內置函數property()

何時以及如何在python中使用內置函數property()

一只名叫tom的貓 2019-10-16 14:49:56
在我看來,除了一點語法糖外,property()并沒有什么用。當然,能夠編寫a.b=2而不是很好a.setB(2),但是隱藏ab = 2不是簡單賦值的事實看起來像是麻煩的秘訣,或者是因為可能發生某些意外結果,例如a.b=2實際上導致a.b成為1?;蛞l異常。還是性能問題?;蛘咧皇橇钊死Щ蟆D芘e一個具體例子來說明它的用法嗎?(用它來修補有問題的代碼不計算在內;-)
查看完整描述

3 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

在像Java這樣的依賴getter和setter的語言中,除了他們說的話,他們不應該做任何事情,也不希望他們做任何事情-如果x.getB()除了返回邏輯屬性的當前值之外,什么都不做b,或者是否x.setB(2)做了任何事情,都將是令人驚訝的需要少量的內部工作才能獲得x.getB()回報2。


但是,對于這種預期行為沒有語言保證,即,以名稱開頭get或為方法的方法主體受到編譯器強制的約束,set而是由常識,社會習俗,“樣式指南”和測試決定。


具有屬性(包含但不限于Python的語言集)的語言中的x.b訪問行為和賦值行為與Java中的getter和setter方法完全相同:期望相同,同樣缺乏語言強制保證。x.b = 2


屬性的首個勝利是語法和可讀性。不得不寫,例如


x.setB(x.getB() + 1)

而不是顯而易見的


x.b += 1

要求向眾神報仇。在支持屬性的語言中,絕對沒有充分的理由迫使該類的用戶經歷這種拜占庭樣板的旋轉,從而不影響其代碼的可讀性。


具體來說,在Python中,使用屬性(或其他描述符)代替getter和setter還有一個更大的好處:如果并且當您重新組織類時,不再需要底層的setter和getter,則可以(無需破壞類的已發布的API)簡單地消除了這些方法和依賴于它們的屬性,從而使的類b成為普通的“存儲”屬性,x而不是通過計算獲得并設置了“邏輯” 屬性。


在Python中,直接(在可行的情況下)而不是通過方法進行操作是一項重要的優化,系統地使用屬性使您能夠在可行的情況下執行此優化(始終直接公開“正常存儲的屬性”,只有那些確實需要在訪問時進行計算的屬性)和/或通過方法和屬性進行設置)。


因此,如果您使用getter和setter代替屬性,那么除了會影響用戶代碼的可讀性之外,您還無償地浪費了機器周期(以及浪費在這些周期中計算機的能量;-),這也是沒有充分理由的任何。


您對屬性的唯一爭論是,例如“通常,外部用戶不會因分配而產生任何副作用”;但是您錯過了這樣一個事實,即同一用戶(使用Java等getter和setter普遍存在的語言)不會期望(可觀察到的)“副作用”由于調用setter而產生(或者對getter的影響更少) ;-)。它們是合理的期望,作為班級作者,您有責任嘗試并適應它們-無論是直接使用setter和getter還是通過屬性使用,都無濟于事。如果您的方法具有明顯的可觀察到的副作用,請不要將其命名為getThis,setThat也不要通過屬性使用它們。


該屬性“隱藏實現”的抱怨是沒有道理的全資:大部分都面向對象是有關實現信息隱藏-制造類負責提出一個邏輯接口與外部世界和內部實現它,因為它最能。就像屬性一樣,getter和setter是實現此目標的工具。屬性只是做得更好(使用支持它們的語言;-)。


查看完整回答
反對 回復 2019-10-16
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

這樣做的目的是讓您避免在實際需要時才編寫getter和setter。


因此,首先要編寫:


class MyClass(object):

    def __init__(self):

        self.myval = 4

顯然,您現在可以寫了myobj.myval = 5。


但是后來,您決定確實需要二傳手,因為您想同時做一些聰明的事情。但是您不需要更改所有使用您的類的代碼-因此您可以將setter包裝在@property裝飾器中,并且一切都可以正常進行。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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