【问题标题】:How do I call a property setter from __init__如何从 __init__ 调用属性设置器
【发布时间】:2010-12-22 21:00:11
【问题描述】:

我有以下一段 python 代码:

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)

理论上这应该打印出密码的 SHA1,但是从构造函数中设置 self.password 会忽略定义的属性,只是将值设置为“password1”。然后 print 语句读取“password1”的值。

我知道这是在类上定义密码而不是在实例上定义的密码,但我不确定如何正确表示它以便它工作。任何帮助将不胜感激。

【问题讨论】:

  • 为什么会有_passwordpassword 的实例?
  • _password 是存储字段。密码是属性访问器。 _password 意味着一个私有字段。密码是公共协议。

标签: python setter init new-style-class


【解决方案1】:

属性是一个描述符,而描述符仅适用于新式类。试试:

class User(object): ...

代替:

class User: ...

可以在here找到一个很好的描述符指南。

【讨论】:

  • 您必须使用 Python 2.x。在 Python 3 中,所有类默认都是新样式的。
猜你喜欢
  • 2018-02-23
  • 2015-11-29
  • 2011-04-25
  • 2017-12-14
  • 1970-01-01
  • 2019-03-02
  • 2019-04-22
  • 2016-01-12
相关资源
最近更新 更多