2013-03-17 13 views
16

Sto provando a definire una classe con una proprietà di sola lettura in un Python; Ho seguito la documentazione Python e si avvicinò con il seguente codice:python - perché la proprietà di sola lettura è scrivibile?

#!/usr/bin/python 

class Test: 
     def __init__(self, init_str): 
       self._prop = init_str 

     @property 
     def prop(self): 
       return self._prop 

t = Test("Init") 
print t.prop 
t.prop = "Re-Init" 
print t.prop 

Ora quando provo ad eseguire il codice anche se mi aspetto errore/eccezione lo vedo sempre eseguito normalmente:

$ ./python_prop_test 
Init 
Re-Init 

mio Python la versione è 2.7.2. Quello che sto vedendo, è previsto? Come assicurarsi che una proprietà non sia impostabile?

risposta

24

per questo al lavoro come ci si aspetta, Test deve essere una classe di nuovo stile:

class Test(object): 
      ^^^^^^^^ 

Questo è accennata nella documentation for property():

ritorno un attributo di proprietà per nuova classi stile (classi che derivano da object).

Quando accendo Test in una classe di nuovo stile, e tentativo di cambiare prop, ottengo un'eccezione:

In [28]: t.prop='Re-Init' 

AttributeError: can't set attribute 
+1

La classe vecchio stile non dà la priorità al descrittore di dati 'property'; ti consente di ombreggiare l'attributo nell'istanza dict. – eryksun

4

Per utilizzare le proprietà è necessario utilizzare classi di nuovo stile. Per utilizzare classi di nuovo stile in Python 2, è necessario ereditare da object. Cambia la classe def a class Test(object).

+0

Nel mio caso Non ha funzionato senza 'object' nemmeno per Python 3 –

Problemi correlati