Python:How-to:依赖于flag的实例的属性,flag本身就是该实例/对象的属性

Python:How-to:依赖于flag的实例的属性,flag本身就是该实例/对象的属性,python,python-3.x,class,object,properties,Python,Python 3.x,Class,Object,Properties,考虑以下关于我的问题的最小示例: 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语句,然后简单地从外部修

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

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
一样。但我仍然很好奇,是否有一种方法可以使工作符合我的要求,即当我更改同一实例的另一个属性时,实例的一个属性会自动更改

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) 超级()的目的是什么。。。。线(3) 设置类属性和执行所做的操作之间有什么区别?(对不起,我对面向对象的编程和措辞还很陌生。)(1)是的。(2) _uMyClass的基类是object。对象实现setattr,因此通过调用super()。\uuuu setatrr\uuuu()我们将值的设置委托给对象。(3) 类属性没有绑定到实例,因此,例如,如果您更改它们,所有将来的实例都将获得新值。对不起,我可以再次给您设置错误吗?我发现你给出的解决方案有问题,这是由于我的错误解释。只要设置了
instance.a
,您所做的操作就会将
instance.b
的值更改为
1
。我需要的是
instance.b
实例时设置为
0
1
。a
分别设置为
False
True
。我试图通过修改您的代码,并在
\uuuu setattr\uuuu()
中额外检查
self.a
的值来实现这一点。但是
self.a
打印为
False
,无论我将
instance.a
设置为哪个值。你知道怎么做吗?所以看来在
\uuu setattr\uuu()
中发生的任何事情都是在属性实际设置之前执行的。至少我认为这是正在发生的事情。