2009-12-03 27 views
10

Tôi có đoạn mã sau đây python:Làm thế nào để gọi một setter tài sản từ __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) 

này nên về mặt lý thuyết in ra SHA1 của mật khẩu, tuy nhiên thiết self.password từ các nhà xây dựng bỏ qua xác định thuộc tính và chỉ đặt giá trị thành "password1". Giá trị của "password1" sau đó được đọc bởi câu lệnh in.

Tôi biết điều này là mật khẩu được định nghĩa trên lớp so với cá thể nhưng tôi không chắc chắn cách thể hiện nó chính xác để nó hoạt động. Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

tại sao bạn có thể hiện của '_password' và' password'? –

+0

_password là trường lưu trữ. mật khẩu là accessor tài sản. _password ngụ ý một trường riêng. mật khẩu là giao thức công khai. –

Trả lời

14

Thuộc tính là bộ mô tả và chỉ có các mô tả hoạt động trên các lớp kiểu mới. Hãy thử:

class User(object): ... 

thay vì:

class User: ... 

Hướng dẫn tốt để mô tả có thể được tìm thấy here.

+0

Cảm ơn bạn - đã làm việc hoàn hảo! –

+2

Bạn phải sử dụng Python 2.x. Trong Python 3 tất cả các lớp là kiểu mới theo mặc định. – AFoglia

+0

Điều đó đúng - 2.6.4 –

Các vấn đề liên quan