2009-12-03 11 views
10

Mam następujący fragment kodu Pythona:Jak mogę zadzwonić setter właściwości z __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) 

ta powinna teoretycznie wydrukować SHA1 hasła, jednak ustawienie self.password z konstruktor ignoruje zdefiniowana właściwość i po prostu ustawia wartość na "password1". Wartość "password1" jest następnie odczytywana przez instrukcję print.

Wiem, że jest to coś w rodzaju hasła, które jest zdefiniowane w klasie w stosunku do instancji, ale nie jestem pewien, jak poprawnie go przedstawić, aby działał. Każda pomoc będzie doceniona.

+0

dlaczego masz wystąpienie '_password' i' password'? –

+0

_password jest polem do przechowywania. hasło jest akcesoriem właściwości. _password oznacza prywatne pole. hasło jest publicznym protokołem. –

Odpowiedz

14

Właściwość jest deskryptorem, a deskryptory działają tylko w klasach nowego stylu. Spróbuj:

class User(object): ... 

zamiast:

class User: ... 

Dobry poradnik do opisów można znaleźć here.

+0

Dziękuję - działało idealnie! –

+2

Musisz używać Python 2.x. W Pythonie 3 wszystkie klasy są domyślnie w nowym stylu. – AFoglia

+0

To prawda - 2.6.4 –

Powiązane problemy