如何从 __init__ 调用属性设置器

Posted

技术标签:

【中文标题】如何从 __init__ 调用属性设置器【英文标题】:How do I call a property setter from __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 意味着一个私有字段。密码是公共协议。 【参考方案1】:

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

class User(object): ...

代替:

class User: ...

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

【讨论】:

您必须使用 Python 2.x。在 Python 3 中,所有类默认都是新样式的。

以上是关于如何从 __init__ 调用属性设置器的主要内容,如果未能解决你的问题,请参考以下文章

将值从文件选择器设置为调用它的对话框

在 Python 中从 __init__ 调用 setter

复合赋值的属性设置器?

如何防止直接设置实例属性?

未调用属性装饰器的 setter 方法

如何使用 Sphinx 为 Python 属性设置器生成文档?