2013-10-26 39 views
-1

我是Python屬性的新手。我想要使​​用它們來創建一個「setter」,以確保在設置相應屬性時屬性值在其允許的範圍內。我在類中訪問python屬性

典型用法示例發現看起來像這樣:

class C(object): 
    def __init__(self): 
     self.__x = None 
    def getx(self): 
     print "+++ getx()" 
     return self.__x 
    def setx(self, v): 
     if (v > 0): 
      print "+++ setx({0})".format(v) 
      self.__x = v 
    def delx(self): 
     print "+++ delx()" 
     del self.__x 
    x = property(getx, setx, delx, "Me property 'x'.") 

在這個簡單的例子中,設定器「SETX」確保只有正值可以被分配給該屬性自.__ X。到現在爲止還挺好。但是,在查看這段代碼時,我開始想知道是否可以使用類中的屬性。例如,我不知道如果我能有下面的構造:

def __init__(self): 
    self.x = None 

,以獲得從構造方法中權稱爲setter方法,以確保屬性自.__ X被設置爲一個有效的值。再進一步,我想知道我是否可以從班上的其他任何人那裏做同樣的事情(除了吸氣器和制動器本身之外)。如果是這樣,這是不是很好的編程習慣?如果不是,還有什麼替代方案?我對此很困惑。

謝謝!

+0

從類內部或外部訪問屬性沒有什麼區別(並且在python解釋器中嘗試這樣做比寫這個問題花費的時間少)。如果你想知道訪問屬性或實際屬性是否更好,這可能取決於具體的用例 - 在你的例子中,用'self.x = None'替換'self .__ x = None'是沒有意義的因爲setter只將值設置爲> 0和'None> 0 == False'。 – l4mpi

+0

感謝您的回覆。在提交問題之前,我確實嘗試了這一點,並且看到它的工作原理,但是由於我找不到這樣的代碼示例,所以我不確定這是否是好的做法和/或是否有任何我不知道的捕獲的。謝謝! –

回答

0

我開始想知道我是否可以使用類 本身的屬性。

是的,你可以使用的setter /吸氣劑構造

def __init__(self): 
    self.x = None 

這是罰款(儘管在這種特定情況下它會失敗,因爲None > 0 == False,您可能希望通過報告的條件登錄或引發異常)。可能有不希望在構造函數中使用訪問器的原因。例如,如果它們需要昂貴的操作,而這些操作在構造函數中執行時沒有用處(例如延遲加載,如延遲實際初始化直到真正需要)。