2009-12-03 10 views
10

Ho il seguente pezzo di codice Python:Come chiamare un setter di proprietà da __init__

import hashlib 

class User: 
    def _set_password(self, value): 
     self._password = hashlib.sha1(value).hexdigest() 

    def _get_password(self): 
     return self._password 

    password = property(
     fset = _set_password, 
     fget = _get_password) 

    def __init__(self, user_name, password): 
     self.password = password 

u = User("bob", "password1") 
print(u.password) 

Questo dovrebbe, in teoria, stampare lo SHA1 della password, tuttavia l'impostazione self.password dal costruttore ignora il proprietà definita e imposta semplicemente il valore su "password1". Il valore di "password1" viene quindi letto dall'istruzione print.

So che si tratta di qualcosa che si definisce in base alla password sulla classe rispetto all'istanza, ma non sono sicuro di come rappresentarlo correttamente, quindi funziona. Qualsiasi aiuto sarebbe apprezzato.

+0

perché hai istanze di '_password' e' password'? –

+0

_password è il campo di archiviazione. la password è la proprietà di accesso. _password implica un campo privato. la password è il protocollo pubblico. –

risposta

14

Una proprietà è un descrittore ei descrittori funzionano solo su classi di nuovo stile. Prova:

class User(object): ... 

invece di:

class User: ... 

una buona guida per i descrittori può essere trovato here.

+0

Grazie - ha funzionato perfettamente! –

+2

Devi usare Python 2.x. In Python 3 tutte le classi sono di nuovo stile per impostazione predefinita. – AFoglia

+0

Questo è corretto - 2.6.4 –

Problemi correlati