2009-12-03 12 views
10

tengo el siguiente trozo de código Python:Como llamar en un pionero de la propiedad de __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) 

Esto debería, en teoría, imprimir el SHA1 de la contraseña, sin embargo, el establecimiento de self.password desde el constructor ignora el propiedad definida y simplemente establece el valor a "contraseña1". El valor de "contraseña1" es luego leído por la declaración de impresión.

Sé que esto se debe a la definición de la contraseña en la clase frente a la instancia, pero no estoy seguro de cómo representarla correctamente para que funcione. Cualquier ayuda sería apreciada.

+0

¿por qué tienes instancia de '_contraseña' y' contraseña'? –

+0

_contraseña es el campo de almacenamiento. la contraseña es el acceso a la propiedad. _contraseña implica un campo privado. la contraseña es el protocolo público. –

Respuesta

14

Una propiedad es un descriptor y los descriptores solo funcionan en las clases de estilo nuevo. Proveedores:

class User(object): ... 

en lugar de:

class User: ... 

Una buena guía para los descriptores se puede encontrar here.

+0

Gracias, funcionó a la perfección! –

+2

Debe usar Python 2.x. En Python 3 todas las clases son de estilo nuevo por defecto. – AFoglia

+0

Eso es correcto - 2.6.4 –

Cuestiones relacionadas