2012-12-01 26 views
1

我想知道如何訪問python類中的實例變量。我應該爲每個實例變量創建一個方法,還是應該直接訪問它們?python獲取實例變量最佳實踐

下面是一個例子:

class Example(object): 

    def __init__(self): 
     self.x = 5 

    def getX(self): 
     return self.x 

    def addYtoX(self, y): 
     return self.x + y # OR: return self.getX() + y 

謝謝!

回答

7

大部分情況下,只需直接訪問它們。 Python is not Java

class Example(object): 
    def __init__(self): 
     self.x = 5 

    def addYtoX(self, y): 
     return self.x + y 

在Java中,你必須使用getter和setter,因爲你不能改變你的想法,改變公共領域的getter和setter以後。在Python中,你可以,所以不要使用getter和setter,除非你真的需要。然後,您改爲使用property

+0

謝謝。但是如果我有一個包含初始化一些實例變量的構造函數的超類,該怎麼辦?那麼我應該在子類中直接訪問它們嗎? – geekkid

+0

他說的只是直接使用它們。如果稍後想要修改/控制返回值的方式,Python會提供[描述符](http://martyalchin.com/2007/nov/23/python-descriptors-part-1-of-2/)所以即使代碼直接調用屬性,也可以覆蓋該行爲。 – Tom

+0

@geekkid:你仍然可以直接訪問它們,是的。 –

1

如果沒有理由提供任何形式的檢查,那麼Python允許你添加/刪除/設定值直接

class A(object): 
    def __init__(self): 
     self.some_var = 5 

a = A() 
a.other_var = 6 

print a.some_var 
a.some_var = 123456 
del a.some_var 

等等

否則,您可以使用setter方法/干將(但只有當您的設計需要如此):

class A(object): 
    def __init__(self): 
     self._some_var = 5 # note the _ 
    @property 
    def some_var(self): 
     return self._some_var 

    @some_var.setter 
    def some_var(self, val): 
     if val > 5: 
      self._some_var = val 
     else: 
      print 'Nope - can not do that!' 
0

保持簡單,只需要直接訪問x。如果在某個晚些時候,您決定需要封裝x,請輸入/值檢查等,然後您可以將其轉換爲property attribute,這允許您定義get/set方法而不必更改任何您現有的客戶代碼。