2017-05-25 63 views
3

我目前正在學習OOP,並且我創建了一個存儲字典作爲變量的類self.foo。我創建了一個方法bar返回self.fooPython - 返回類變量的最佳做法是什麼?

class FooBar: 

    def __init__(self): 
     self.foo = {} 

    def bar(self): 
     return self.foo 


if __name__ == '__main__': 
    FooBar() 

我的問題是這樣的。直接調用類變量並使用bar方法產生相同的結果,這是訪問self.foo的正確方法,還是沒有什麼區別?

下面是一些例子:

>>>test = FooBar() 
>>>test.foo['test'] = 'This is a test' 
>>>print(test.foo) 
'{'test': 'This is a test'}' 

>>>test.bar()['test_2'] = 42 
>>>print(test.bar()) 
'{'test': 'This is a test', 'test_2': 42}' 
+1

「這是訪問self.foo的正確方法」 - 取決於類的用途以及它如何記錄。 – khelwood

+6

您可能想了解一下'@ property'裝飾器:https://stackoverflow.com/a/17330273/295246 –

回答

2

這兩種方法都是正確的,它並沒有太大的差別,你選擇哪一個。使用bar(self)方法的方法是經典的「getter」方法,通常用於其他OO語言來訪問典型的私有成員,但在python中,每個成員默認都是公共的,如果使用getter方法,則不會產生影響bar(self)或者直接調用成員foo。

或者,對於getter方法,如果要以不同名稱訪問成員foo,還可以使用裝飾器@property。但是,如果您不需要對foo成員進行任何操作,然後以另一個名稱進行訪問並將其返回,則還可以在構造函數中簡單地將foo成員的引用添加爲self.bar = self.foo,以便您可以訪問不同的成員名稱。 (我認爲創建一個方法或使用屬性只是爲了以不同的名稱訪問成員,我會使用對成員的引用,但那是我個人的偏好)。

但是,如果您想要標記成員應該被視爲私密,並且應該僅在類中或使用setter方法進行修改,那麼通常的做法是使用_(例如_foo)啓動成員名稱。

+0

+1很好的答案。我想說的一切。我會加1件東西。將getter和setter方法編碼給公共成員並不認爲是pythonic。如果你想像這樣訪問你的變量,那麼你應該讓它們是私人的,就像答案中所描述的那樣。 – SH7890

0

你應該總是使用property裝飾。

如果你直接從函數返回變量,那麼這是錯誤的,讀者可能會認爲在被調用的函數中會有一些計算或修改,但事實上,你只是傳遞變量,所以屬性裝飾器將給讀者更清楚的背景。

class FooBar: 

    def __init__(self): 
     self.foo = {} 
    @property 
    def bar(self): 
     return self.foo 

然後訪問它像,

>>>test = FooBar() 
>>>test.foo['test'] = 'This is a test' 
>>>print(test.foo) 
'{'test': 'This is a test'}' 

>>>test.bar['test_2'] = 42 
>>>print(test.bar) 
'{'test': 'This is a test', 'test_2': 42}' 
+1

「您應該_always_使用'property'裝飾器」?那有什麼意思?在任何情況下,房產總是合適的選擇? – khelwood

+0

@khelwood補充說明。 – harshil9968

相關問題