2011-10-27 75 views
1

我有以下代碼:Python的屬性來限制訪問

class C: 
    def __init__(self, dx = 1): 
     self._dx = dx 
    def get_dx(self): 
     return self._dx 

    dx = property(get_dx,None,None) 

c = C() 
print c.dx 
c.dx = 42 
print c.dx # this shows 42 

這應該工作(see here)。然而,這不是我的問題如下:

  1. 是它在所有可能從做限制用戶:c.dx = 42
  2. 如果是這樣,怎麼樣? (我的意圖是使只讀屬性,我知道,總有破解辦法解決它,但我只是想阻止標準c.dx = VAL從工作)
+0

注意'c.dx'是'c._dx'完全不同。另外請注意,python不是java。 –

+0

我知道c.dx與c._dx不是一樣的,但是你是指「注意python不是java」?我知道私有變量不存在於python中,就像它們在java中一樣,但是代碼的哪一部分讓你這麼說? :P –

+0

我想我只是在質疑不可能做c.dx = 42的背後。 (但的確,你接受的答案是正確的做法!) –

回答

4

property沒有二傳手定義是隻讀的。這可能不起作用的唯一原因是你使用Python 2並定義了一箇舊式類。請記住,總是在Python 2.x中從object得出:

class C(object): 
    @property 
    def dx(self): 
     return self._dx 

    def __init__(self, dx = 1): 
     self._dx = dx 
+0

謝謝,uni確實使用python 2.5.2 :) –

0
class C: 
    def __init__(self, dx = 1): 
     self.__dx = dx 
    def get_dx(self): 
     return self.__dx 

    dx = property(get_dx,None,None) 

c = C() 
print c.get_dx() 
print c.__dx # this raise error 

來源: http://docs.python.org/tutorial/classes.html#private-variables

+0

爲什麼雙下劃線?這是不是使python mangle命名空間? (或者可能是?) –

+0

沒有理由使用名稱修飾,如果您的示例訪問類似於OP(使用屬性,而不是明確的getter和底層屬性),則它將完全相同。 – delnan

+0

@Arnab Datta表單__spam的任何標識符(至少兩個前導下劃線,最多一個尾隨下劃線)被文本替換爲_classname__spam,其中classname是當前類名稱,並帶有前導下劃線。只要它在類的定義內發生,就不會考慮標識符的語法位置。 –