Python:如何根据同一实例的另一个属性的布尔值自动更改实例的属性?
假设我有这个类和它的一个实例Python:如何根据同一实例的另一个属性的布尔值自动更改实例的属性?,python,python-3.x,object,attributes,instance,Python,Python 3.x,Object,Attributes,Instance,假设我有这个类和它的一个实例 class MyClass: a = False b = [0,1,2] MCi = MyClass() 显然MCi.a给出False和MCi.b给出[0,1,2] 我想要的是,如果我设置MCi.a=True,则MCi.b的值将变为[0,1,2,3,4,5]。我想让它回到[0,1,2]当我回退MCi.a=False时 换句话说,MCi.a应该指示MCi.b,而不必从外部设置后一个属性值 我该怎么做 这个问题非常接近我之前提出的问题,但我的措辞不够
class MyClass:
a = False
b = [0,1,2]
MCi = MyClass()
显然MCi.a
给出False
和MCi.b
给出[0,1,2]
我想要的是,如果我设置MCi.a=True,则MCi.b的值将变为[0,1,2,3,4,5]
。我想让它回到[0,1,2]
当我回退MCi.a=False
时
换句话说,MCi.a
应该指示MCi.b
,而不必从外部设置后一个属性值
我该怎么做
这个问题非常接近我之前提出的问题,但我的措辞不够仔细,因此提供的解决方案实际上并不是我所需要的。不过,使用\uuuu setattr\uuuuu()
可能是一个好的开始。但是到目前为止我失败了。在这种情况下,我会使用一种方法来设置布尔值。这样您就不会直接从外部设置布尔实例变量,而是调用一个方法来更改它。如果您想隐藏,实际上使用了一个方法,您可以将它定义为一个属性。这看起来像:
class MyClass:
# prefix the instance variables with an underscore
# as a convention to indicate they are private
_a = False
_b = [0,1,2]
# define accessors
@property
def a(self):
return self._a
@a.setter
def a(self, bool):
self._a= bool
if bool is True:
self._b= [0,1,2,3,4,5]
else:
self._b= [0,1,2]
# define accessors
@property
def b(self):
return self._b
现在我们可以测试这一点:
o= MyClass()
print(f'{o._a}, {o._b}')
o.a=True
print(f'{o._a}, {o._b}')
o.a=False
print(f'{o._a}, {o._b}')
print(o.b)
o.b=[12,3]
这张照片是:
False, [0, 1, 2]
True, [0, 1, 2, 3, 4, 5]
False, [0, 1, 2]
[0, 1, 2]
Traceback (most recent call last):
File "<ipython-input-14-1e243ad0d3ed>", line 8, in <module>
o.b=[12,3]
AttributeError: can't set attribute
False[0,1,2]
正确[0,1,2,3,4,5]
错误[0,1,2]
[0, 1, 2]
回溯(最近一次呼叫最后一次):
文件“”,第8行,在
o、 b=[12,3]
AttributeError:无法设置属性
因此,您可以看到,当通过o.a=
分配布尔值时,\u b
的内容确实发生了变化,而且,您可以通过使用属性o.b
访问o.b
的值。这只是因为我没有定义setter。如果你想拥有一个,你必须为它定义一个函数,就像在a
的setter中一样
如果以这种方式定义,则应遵循约定,即不访问代码中classMyClass
之外的任何地方的真实实例变量\u a
和\u b
。是否尝试过@propertydecorator@Britzel,我跟随你的链接到你先前的问题。我仍然对一件事有点困惑——您希望a
和b
成为实例属性还是类属性?希望你能意识到其中的差异。嗨@fountainhead!当我问这个问题时,我还没有意识到其中的区别。现在我想我是这样的:class属性更改类中变量的值,即在blueprint中创建实例。因此,每个新实例都会有新值,而每个旧实例都会保留旧值。实例属性的更改使蓝图保持不变,但它只更改特定实例的值。对吗?@fountainhead如果是,那么我想我需要的是一个实例属性。我还不是100%确定,因为我还没有在我的实际代码中测试它。我在这里发布的是,我认为这是一个证明我需要什么的最小示例。但周一在办公室里还可以看到它嗨@jottbe,非常感谢你!这正是我需要的。你能帮我理解一下吗:我不知道这个带有@
的符号。我试着删除这些行,但它不起作用,所以它似乎很重要。这些是什么意思?哦,我找到了一个很好的来源来解释它。这是一种特殊的装饰。嗨,这叫装饰。没有它,您将只有一个方法a
btw。因为行defa(self,bool)
将覆盖定义defa(self)
。