Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何根据同一实例的另一个属性的布尔值自动更改实例的属性?_Python_Python 3.x_Object_Attributes_Instance - Fatal编程技术网

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中一样


如果以这种方式定义,则应遵循约定,即不访问代码中class
MyClass
之外的任何地方的真实实例变量
\u a
\u b

是否尝试过@propertydecorator@Britzel,我跟随你的链接到你先前的问题。我仍然对一件事有点困惑——您希望
a
b
成为实例属性还是类属性?希望你能意识到其中的差异。嗨@fountainhead!当我问这个问题时,我还没有意识到其中的区别。现在我想我是这样的:class属性更改类中变量的值,即在blueprint中创建实例。因此,每个新实例都会有新值,而每个旧实例都会保留旧值。实例属性的更改使蓝图保持不变,但它只更改特定实例的值。对吗?@fountainhead如果是,那么我想我需要的是一个实例属性。我还不是100%确定,因为我还没有在我的实际代码中测试它。我在这里发布的是,我认为这是一个证明我需要什么的最小示例。但周一在办公室里还可以看到它嗨@jottbe,非常感谢你!这正是我需要的。你能帮我理解一下吗:我不知道这个带有
@
的符号。我试着删除这些行,但它不起作用,所以它似乎很重要。这些是什么意思?哦,我找到了一个很好的来源来解释它。这是一种特殊的装饰。嗨,这叫装饰。没有它,您将只有一个方法
a
btw。因为行
defa(self,bool)
将覆盖定义
defa(self)