2013-05-17 20 views
0

我想知道是否有可能有一個屬性設置器也返回一個值。下面的代碼試圖從表面上解釋這個問題。Python的二傳手也返回一個值

基本上我需要設置一個屬性到一個對象,但在我需要檢查它是否唯一之前。我想知道是否有辦法直接向用戶返回唯一名稱,而不需要事後查詢對象的新名稱。

class MyClass(object): 
    def __init__(self,ID): 
     self._ID = ID 
    @property 
    def Name(self): 
     return DBGetName(self._ID) 

    @Name.setter 
    def Name(self, value): 
     UniqueName = DBGetUniqueName(self._ID,value) 
     return DBSetName(UniqueName) 

Myinstance = MyClass(SomeNumber) 
#What I do now 
Myinstance.Name = "NewName" 
Uniquename = Myinstance.Name 

#What I was wondering if possible. Line below is syntactically invalid, but shows the idea. 
Name = (Myinstance.Name = "NewName") 

編輯: 它是一個僞代碼和我忘了實際值傳遞給內部函數。我的錯。

+0

我對此有點困惑。看起來二傳手完全忽略了你傳遞它的價值。一個使用'MyInstance.Name ='NewName''並將名稱設置爲''NewName-071839''的設置器我會理解,但這會讓我(即使在JavaScript或C#或允許使用它的其他語言中)也這樣。 – abarnert

+1

那麼,它在語法上是有效的做'Name = Myinstance.Name =「NewName」',但是setter的返回值將被忽略,並且它將'Name'設置爲''NewName''。 – Aya

+0

@Aya:好點。如果沒有括號,這將是一個鏈式賦值語句,意思是「將這個值賦給所有鏈接在一起的名字」。在非常簡單的情況下,它和C/JS /等一樣。 「將這個值賦給姓氏,然後將賦值的結果賦給它之前的那個......」,但是在這種情況下它並沒有幫助。 – abarnert

回答

4

確定一個setter 可以返回一個值。

但是這樣做並不是很有用,因爲setter通常用在賦值語句中 - 就像你的例子。

問題是,在Python中,賦值不是一個表達式,而是一個聲明。它沒有可以使用的值,也不能將其嵌入到另一個語句中。所以,沒有辦法寫你想寫的行。

你可以改爲明確地調用setter ...但是在這種情況下,將它作爲常規方法而不是屬性setter編寫會更清晰。


在你的情況,我認爲一個正常的方法正是你想要的。你完全忽略了傳遞給setter的值。這會讓你的代碼讀者感到困惑(包括你在6個月內)。它根本不是真正的setter,它是一個創建獨特名稱的函數。那麼,爲什麼不把它稱之爲?

def CreateUniqueName(self): 
    UniqueName = DBGetUniqueName(self._ID) 
    return DBSetName(UniqueName) 

(值得一提的是DBSetName回到它的參數本身不是很Python的...)


如果你想知道爲什麼 Python的這種方式工作,看到Why can't I use an assignment in an expression?從官方FAQ。

更一般地,表達式語句的區別連同相關特徵如變異方法(例如,list.sort)返回None而不是self,導致更簡單,更規則的語言。當然,這是一種成本,因爲它導致了一種不太流利的語言。有一個顯而易見的折衷,Python可以達到儘可能極端的程度。 (與JavaScript相比,儘管你可以得到極端,但對於來說,這是相當差勁的。)但是大多數熱愛Python的人認爲它是正確的折衷。

+0

是的,這是我來到的結論。我也同意,這使得閱讀代碼變得困難,但我很好奇,如果有可能的話。 – Mac