2011年4月18日 星期一

Python -- property

先來談談property,我第一次看到類似property的東西是在delphi上面,他讓programmer可以作一些存取控制,但是有如同直接存取變數一樣
接下來java bean也再看到了一次這樣的東西,很不幸的這次是一堆getter跟setter,也就是你必須在屬性前面加上getArea, setArea等等,即使他只是單純的access一個變數,如果沒有IDE的幫助,這簡直是一個惡夢

python上面的作法是使用decorator,也就是用@property這個語法,他支援四種引數,getter, setter,deleter, docstring
可以想像得到,如果使用一個自動計算面積的circle class,如果希望直接取得屬性,如circle.area,你可以使用
@property
def area(self):
return math.pi*(self.radius**2)
如果是setter則是
@property
def radius(self):
return self.__radius
@property.setter
def radius(self,radius):
assert radius>0, "radius must be non zero and non-negative!"
self.__radius=radius
由於property的作用,不用擔心radius這個屬性會產生名稱衝突,其實一使用property的時候,四個屬性等於全部被啟用,但是預設由python接手沒寫得東西,但是python就是啥都不做XD

回過頭來說到屬性,很多時候真的覺得他只是一個candy,也就是甜頭啦,如果說老是充斥這種東西,方便性取代了程式的易讀性以及可能會忽略掉一些程式的邏輯
當一個programmer讀到某個function,他會心裡開始描述這個function的運作方式,他也的確知道這個function出現的時機,對於理解程式是有正面的幫助的,但是因為property的作用,使用者可能會無法領悟到這部份的事實
接下來另外一點干擾是邏輯性,當使用變數的時候,你並不會預期他會丟出一個例外,可是這對很多function來說是很正常的事情,甚至是必要的,在這樣的狀況下,很多使用者會忽略這個部份

老實說,綜觀這麼多程式,我很少可以找到一個絕對的必要性,必須使用property,如果是簡單的access,大可讓使用者直接access,如果必須作一些boundary控制,我覺得應該使用function模式,讓使用者在使用的時候有所警惕

另外其實decorator在python裡面有其他神奇的作用,java也是,decorator感覺已經有點變成語法了orz,另外一個討厭decorator的地方是,感覺他很不像"語法",像是註解,但是又有程式的"邏輯"/"作用"在,decorator其他部份以後有時間再寫

沒有留言: