【问题标题】:How to get object attributes to update dynamically in Python如何在 Python 中获取对象属性以动态更新
【发布时间】:2019-05-14 03:12:33
【问题描述】:

我想创建一个有 2 个输入属性和 1 个输出属性的类,这样每当修改一个输入属性时,输出属性就会自动修改

我尝试将属性定义为构造函数内部和外部的实例变量,但无论哪种情况,在实例化对象后,输出属性都保持固定在实例化时刻设置的值

class Example():

    def __init__(self,n):
        self.name=n

    inA=1
    inB=1

    if inA==1 and inB==1:
        outA=1
    else:
        outA=0

当实例化时 outA 按预期设置为 1 但如果我尝试更新: object.inA=0

object.outA 保持为 1,而我需要将其更新为 0

尽可能避免使用函数。如果这个问题是荒谬的或有一个明显的答案,那么对于 python 和 OOP 来说很抱歉

【问题讨论】:

  • 在类级别(方法外)定义的代码仅在类(而不是实例)上下文中的类初始化时运行一次。

标签: python python-3.x


【解决方案1】:

如果您想要依赖于其他实例属性的实例属性,属性是您的最佳选择。

class Example:
    def __init__(self, n):
        self.name = n
        self.inA = 1
        self.inB = 1

    @property
    def outA(self):
        return self.inA and self.inB

您可以像访问常规实例属性obj.outA 一样访问outA

>>> my_obj = Example("example")
>>> my_obj.outA
1

更改inAinB 属性会影响outA

>>> my_obj.inA = 0
>>> my_obj.outA
0

【讨论】:

    【解决方案2】:

    您可以在类中创建一个函数并进行一些其他小的更改:

    class Example():
    
        def __init__(self,n):
            self.name=n
            self.inA=1
            self.inB=1
    
        def f(self):
            if self.inA==1 and self.inB==1:
                self.outA=1
            else:
                self.outA=0
    

    称呼它:

    a = Example('foo')
    a.inA = 0
    a.f()
    print(a.outA)
    

    输出:

    0
    

    如你所见,取出:

    a.f()
    

    行会导致错误:

    AttributeError: 'Example' object has no attribute 'outA'
    

    【讨论】:

    • 抱歉,stackexchange 的新手直到现在才看到评论/知道接受
    【解决方案3】:

    你想让它返回你的输出吗?

    扩展 U9-Forward 的答案:

    class Example():
    
        def __init__(self,n):
            self.name = n
            self.inA = 1
            self.inB = 1
    
        def f(self):
            return self.inA and self.inB
    

    【讨论】:

      猜你喜欢
      • 2016-09-09
      • 1970-01-01
      • 2021-08-13
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 2013-02-01
      • 1970-01-01
      相关资源
      最近更新 更多