您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在Python方法中设置属性

在Python方法中设置属性

我想过的是,我想这是一种用于实现纯只读属性的更干净的解决方案。它是tangentstorm提供的解决方案的一种变体,但__getattr__完全不需要使用该方法

class Foo(object):
    def __init__(self):
        self.readonly = set()

    def set_readonly(self, attr, value):
        setattr(self, attr, value)
        self.readonly.add(attr)

    def __setattr__(self, attr, value):
        if hasattr(self, "readonly") and attr in self.readonly:
            raise AttributeError("Read only attribute: %s" % (attr,))
        object.__setattr__(self, attr, value)

它是这样的:

>>> f = Foo()
>>> f.x = 5
>>> f.set_readonly("y", 9)
>>> f.x, f.y
(5, 9)
>>> f.x = 7
>>> f.y = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ro.py", line 13, in __setattr__
    raise AttributeError("Read only attribute: %s" % (name,))
AttributeError: Read only attribute: y

使只读属性再次可读写很容易:

    def unset_readonly(self, attr):
        self.readonly.remove(attr)

在我第一次尝试编写此想法时,我使用self.__readonly而不是self.readonly,但这会导致实际上设置__readonly属性存在问题,因为我需要取消“ private”属性的检查,以检查其存在(hasattr(self, "_Foo__readonly")),并且不鼓励。

python 2022/1/1 18:50:49 有374人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶