2013-04-27 38 views
1

更改兩個屬性值,我有兩個屬性,當我爲foo設置一個新值的一類,我想的是值的bar 也隨之變化,這樣我就可以像去這樣的:的屬性setter命名慣例,在蟒蛇

class MyClass(object): 

    _foo = '' 
    _bar = '' 

    @property 
    def foo(self): 
    return self._foo 

    @foo.setter 
    def foo(self, foo): 
    self._foo = foo.lower() 
    self._bar = foo.upper() 

    @property 
    def bar(self): 
    return self._bar 

我不想反映的方式,當我改變bar foo變化的價值,所以我沒有實現的setter爲bar在其他方向上的變化。

閱讀關於乾淨的代碼實踐我發現這是一個很好的習慣,根據它們的具體名稱命名你的方法,所以我認爲,不要使用上面的語法,我可以使用這個定義,似乎更自我解釋:

def set_foo_and_bar(self, foo): 
    self._foo = foo.lower() 
    self._bar = foo.upper() 

現在的問題是,我失去了Python的語法object.property。我真的認爲這是一個虛擬問題,但我想知道如何處理這種依賴操作的定義,我應該使用第一種語法還是第二種語法?如果setter方法更改狀態更劇烈,說更改更多的屬性?,我應該使用註釋來說明這兩個屬性之間存在依賴關係嗎?或者讓客戶發現他自己的'魔術'行爲?

+2

使用佔位符名稱*,當然*不明顯。但在真實的代碼中,我會假設任何不明確的情況都來自錯誤的命名。例如,假設一個GUI小部件的整型屬性'width'和'right_border'。現在不是很奇怪,是嗎? – delnan 2013-04-27 15:16:36

+0

@delnan與你的小部件示例很明顯,屬性是依賴的,比如說我改變了寬度,所以尺寸也發生了變化,但是對於語義上不太接近的屬性,我認爲如果我不是那麼'心智映射'明確的定義。 – Twissell 2013-04-27 15:23:34

+0

請舉個例子。正如我所說的,我只能想象這個問題來自不明名字或其他東西。或者也許屬性*不應該相互影響。 – delnan 2013-04-27 15:25:33

回答

0

我意識到這是一個老問題,但似乎答案很簡單。 foo.setter裝飾器返回一個新的property對象,裝飾函數作爲該屬性的設置器,裝飾器語法意味着此返回值存儲在函數的位置。因此,如果您希望foo屬性正常工作,則還需要命名裝飾函數foo。如果您使用不同的函數名稱,則無法使用裝飾器語法,否則將會損壞屬性。

如果有有意義的變量名是對你至關重要,你應該手動應用property你的getter和setter方法:

class MyClass(object): 

    _foo = '' 
    _bar = '' 

    def _get_foo(self): 
    return self._foo 

    def _set_foo_and_bar(self, foo): 
    self._foo = foo.lower() 
    self._bar = foo.upper() 

    foo = property(_get_foo, _set_foo_and_bar) 

    @property 
    def bar(self): 
    return self._bar 

這似乎並沒有給我非常有用。我總是喜歡裝飾器的語法,除非有緊迫的理由不這樣做。問題中的代碼完美地完成了任務。