python - 如何在 Python3 中作为类的一部分正确调用 __setattr__()?

标签 python python-3.x setattr

我想在设置对象属性时调用一个函数:

class MyClass():
    myattrib = None

    def __setattr__(self, prop, val):
        self.myattrib = val
        print("setting myattrib")

x = MyClass()
x.myattrib = "something"

问题是,这会产生无限递归。

想法是在设置成员变量时调用函数(并实际设置该成员变量),但同时运行额外的代码(在 print() 语句中展示上面的例子)。

另一种明显的方法是使用 set_attrib() 函数,这在 Java 中很常见,但我想用 pythonic 的方式来做,并直接设置属性,但同时运行额外的代码。

最佳答案

通过super()调用基础版本:

class MyClass(object):
    myattrib = None

    def __setattr__(self, prop, val):
        super().__setattr__('myattrib', val)
        print("setting myattrib")

您可能不想在这里忽略 prop 参数,它不一定是正在设置的 'myattrib'

但是,请考虑使用属性 而不是拦截所有 属性设置:

class MyClass(object):
    _myattrib = None

    @property:
    def myattrib(self):
        return self._myattrib

    @myattrib.setter
    def myattrib(self, val):
        self._myattrib = val
        print("setting myattrib")

我添加了 object 作为基类;这是 Python 3 中的默认设置,但要求 super()property 对象在 Python 2 中工作。

关于python - 如何在 Python3 中作为类的一部分正确调用 __setattr__()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35011168/

相关文章:

python - 强大的Python3 shebang线?

python - 在初始化之前禁用 `__setattr__` 的干净方法

python - 划分数据框列: TypeError: 'int' object is not iterable

python - 无法导入第三方库python3

python - 列表列表中的组合

python - 如何将给定数据框的索引和列名称一起列出?

python - 如何在Python中的嵌套对象中设置属性?

python - __setattr__() 可以在带有 __slots__ 的类中定义吗?

python - Python- Pyramid 和matplotlib-SVG不能超过一个 View 输出吗?

Python 泡沫显示以下问题 "RuntimeError: maximum recursion depth exceeded"