2017-09-14 107 views
0

我想定義一個類,以確保在設置/修改屬性時有一些約束。此外,我希望能夠以相同的約束條件設置施工時的財產價值。簡單的例子:從__init設置Python屬性__()

class MyClass(object): 
    def __init__(self, attrval): 
     self.myattr = attrval 

    @property 
    def myattr(self): 
     return self._myattr 

    @myattr.setter 
    def myattr(self, value): 
     if value is None: 
      raise ValueError("Attribute value of None is not allowed!") 
     self._myattr = value 

我打電話屬性setter直接從INIT(),因此其屬性就是self._myattr可直接訪問的唯一場所。在使用這樣的屬性時是否有任何問題或警告(如_myattr的缺失或無效創建)?也許當(多重)繼承進來時?是否有關於如何正確初始化init()的屬性的PEP或其他「官方」聲明?

我發現的大多數屬性示例都沒有使用構造函數中的屬性setter。在How to set a python property in __init__中,在設置屬性之前,會明確創建基礎屬性。有些人認爲每個單獨的屬性都必須在init()中明確初始化,這就是爲什麼我的代碼示例感覺有點奇怪。

回答

0

不會有任何問題。使用適合你的東西。

要記住的一件事是,使用setter設置屬性將運行您設置的驗證。直接在__init__中設置屬性將不會執行該驗證。這會使setter版本變得更慢,但是由於不允許某些值,因此更安全。