2009-12-03 5 views
10

eine Eigenschaft Setter von Ich nenne:Wie haben Code das folgende Stück Python I __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) 

Diese in der Theorie aus dem SHA1 des Passworts jedoch gedruckt werden soll, self.password Einstellung von der Konstruktor die ignoriert definierte Eigenschaft und setzt den Wert auf "password1". Der Wert von "password1" wird dann von der print-Anweisung gelesen.

Ich weiß, das ist etwas bis auf das Passwort in der Klasse im Vergleich zu der Instanz definiert ist, aber ich bin mir nicht sicher, wie man es richtig darstellt, so dass es funktioniert. Jede Hilfe wäre willkommen.

+0

Warum haben Sie eine Instanz von '_password' und' password'? –

+0

_password ist das Speicherfeld. Passwort ist die Eigenschaft Accessor. _Passwort bedeutet ein privates Feld. Passwort ist das öffentliche Protokoll. –

Antwort

14

Eine Eigenschaft ist ein Deskriptor, und Deskriptoren funktionieren nur für neue Stilklassen. Versuchen:

class User(object): ... 

statt:

class User: ... 

Ein guter Leitfaden für Deskriptoren here gefunden werden kann.

+0

Danke - hat perfekt funktioniert! –

+2

Sie müssen Python 2.x verwenden. In Python 3 sind alle Klassen standardmäßig neu. – AFoglia

+0

Das ist richtig - 2.6.4 –