2012-03-10 49 views
13

希望避免這樣的情況下屬性的創作:Python對象 - 避免與未知名

>>> class Point: 
x = 0 
y = 0 
>>> a = Point() 
>>> a.X = 4 #whoops, typo creates new attribute capital x 

我創建了下面的物件,用來作爲超:

class StrictObject(object): 
    def __setattr__(self, item, value): 
     if item in dir(self): 
      object.__setattr__(self, item, value) 
     else: 
      raise AttributeError("Attribute " + item + " does not exist.") 

雖然這看起來工作,蟒蛇documentation says of dir()

注:因爲dir()主要是爲了方便在交互式提示符下使用而提供,它試圖提供一組有趣的名稱,而不是試圖提供一組嚴格或一致定義的名稱,並且其詳細行爲可能會在不同版本間發生變化。例如,當參數是一個類時,元類屬性不在結果列表中。

有沒有更好的方法來檢查對象是否有屬性?

回答

2

我不認爲這是一個好主意,編寫代碼來防止這種錯誤。這些「靜態」檢查應該是IDE的工作。 Pylint會警告您關於分配__init__以外的屬性,從而防止拼寫錯誤。它還顯示了許多其他問題和潛在的問題,它可以很容易地從PyDev使用。

+0

+1有關Pylint的有用信息。 – 2012-03-10 14:48:24

2

在這種情況下,你應該看看python標準庫可能提供給你什麼。你有沒有考慮這個namedtuple?

from collections import namedtuple 

Point = namedtuple("Point", "x, y") 

a = Point(1,3) 

print a.x, a.y 

因爲Point現在是不可變的,所以你的問題不可能發生,但是回退自然是你不能發生的。只需向+1添加+1,但必須創建一個完整的新實例。

x,y = a 
b = Point(x+1,y) 
+0

+1有用的信息:我不知道namedtuple。 – 2012-03-12 11:51:59