【问题标题】:Python: How to: attribute of an instance which depends on flag, which is itself an attribute of that instance / objectPython:如何:依赖于标志的实例的属性,该标志本身就是该实例/对象的属性
【发布时间】:2021-02-04 17:42:16
【问题描述】:

为我的问题考虑以下最小示例:

class MyClass:
    a = False
    b = 0
    if a:
        b = 1

MCinst = MyClass()

这里MCinst有两个属性MCinst.a和MCinst.b,默认值分别为False和0。我试图用if 语句实现的是,当我设置MCinst.a = True 时,MCinst.b 的值会自动切换到1。但这显然不能按预期工作,因为 MCinst.b 的值仍然是 0。

我知道我可以删除if 语句并简单地从外部修改b,就像我修改a 一样。但我仍然很好奇是否有一种方法可以让工作成为我想要的——即当我更改同一个实例的另一个属性时,让实例的属性自动更改。

【问题讨论】:

标签: python python-3.x class object properties


【解决方案1】:
class MyClass:
    a = False
    b = 0     

    def __setattr__(self, key, value):
        if key == 'a':
            setattr(self, 'b', 1)
        super().__setattr__(key, value)

如果你真的想改变class属性,你可以使用

setattr(self.__class__, 'b', 1)

【讨论】:

  • 有效!非常感谢罗伊克。请允许我提出一些后续问题:(1)所以 setattr 会在设置属性时自动调用? (2) super().... 行的目的是什么? (3)设置类属性和做你做的有什么区别? (对不起,我对 Obj 很陌生。面向编程和措辞。)
  • (1) 是的。 (2)_MyClass_的基类是object。 object 实现了 setattr,因此通过调用 super().__setatrr__() 我们将值的设置委托给 object。 (3) 类属性不绑定到一个实例,所以如果你改变它们,所有未来的实例都会得到新的值。
  • 对不起,我可以再打扰你一次吗?我发现您提供的解决方案有问题,这是由于我的错误解释造成的。只要设置了instance.a,您所做的就会将instance.b 的值更改为1。我需要将instance.b 设置为0 或1,只要instance.a 分别设置为False 或True。我试图通过修改您的代码来做到这一点,并另外检查__setattr__() 内部的self.a 的值。然而self.a 打印为False,无论我将instance.a 设置为哪个值。你知道怎么做吗?
  • 所以似乎__setattr__() 中发生的任何事情都是在实际设置属性之前执行的。至少这是我认为正在发生的事情。
猜你喜欢
  • 2021-06-22
  • 2016-08-28
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2023-03-27
相关资源
最近更新 更多