如何更改引用另一个对象属性的对象属性的值?

安德鲁·潘普奇(Andrew Pampuch)
class Bar:

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

class Foo:

    def __init__(self, l):
        self.l = l

x = Bar(2)

# we want x.n to change whenever y.l changes
y = Foo(x.n)

# I'd like x.n to become 3 as a result
y.l += 1

print(x.n)
>>> 2

我该如何做才能x.n从内部进行更改y没有向其中添加更多功能的简便方法x吗?

mor

嗯,正如其他人已经指出的那样,问题归结为您正在处理不可移植对象的事实在意识到这一点之后,您应该使用可变类型,或者使用回调来管理更新。Adriano Abrantes给出了使用可变类型的替代方法的示例,但是如果您不是要查找的类型,那么这里是潜在的回调系统的示例:

# bad habit to be using the old style class definition (i.e. `class Foo:`)
# the `@property` decorator wont work if you use the old style

class Sync(object):

    def __init__(self, name, value, *dependants):
        """Sync the attribute `name` on all `dependants` when `self.value` is updated"""
        self._name = name
        self._value = value
        self._updating = False
        self._dependants = list(dependants)
        self._update_dependants()

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, x):
        if x != self._value:
            self._value = x
            self._update_dependants()

    def _update_dependants(self):
        self._updating = True
        for d in self._dependants:
            if getattr(d, self._name) != self.value:
                if isinstance(d, Sync):
                    if not d._updating:
                        setattr(d, self._name, self.value)
                else:
                    setattr(d, self._name, self.value)
        self._updating = False

    def add_dependant(self, other):
        self._dependants.append(other)
        self._update_dependants()

    def del_dependnant(self, other):
        self._dependants.remove(other)

    def __repr__(self):
        return "Sync('"+self._name+"': "+repr(self.value)+")"

    def __eq__(self, other):
        if isinstance(other, Sync):
            return self.value == other.value
        else:
            return self.value == other

    def __ne__(self, other):
        return not self.__eq__(other)


s1 = Sync('value', 2)
s2 = Sync('value', 1)
print('setup the Sync objects:')
print('>>> ' + repr(s1) + (' == ' if s1 == s2 else ' != ') + repr(s2))

s1.add_dependant(s2)
s2.add_dependant(s1)
print('add sync objects as dependants of each other:')
print('>>> ' + repr(s1) + (' == ' if s1 == s2 else ' != ') + repr(s2))

s1.value += 1
print('check that value changes transfer from one to the other:')
print('>>> ' + repr(s1) + (' == ' if s1 == s2 else ' != ') + repr(s2))

如果这仍然不能使您满意,我将研究一种名为Traitlets的东西这是Ipython的一个软件包,是Jupyter项目的一部分,该软件包可进行类型检查,简化回调系统并简化应用程序的配置。我已经为这个项目做过一段时间了,因此,如果您对Traitlets有任何疑问,请随时在这里询问我或将其发布在Gitter上,开发团队将为您解答。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何订阅rxjs中另一个对象中引用的对象的属性更改

来自分类Dev

如何在同一Javascript对象中的另一个属性的值中引用一个属性?

来自分类Dev

如果对象与另一个对象属性匹配,如何获取对象中的值

来自分类Dev

在React中,如何使用另一个属性值获取对象的属性值?

来自分类Dev

如果我有一个对象是另一个对象的属性,如何从该属性对象引用主对象?

来自分类Dev

ng-model更改另一个对象的属性值的问题

来自分类Dev

引用相同对象类型的另一个对象实例的类对象属性

来自分类Dev

从另一个对象注册一个对象的属性更改

来自分类Dev

JavaScript:如果另一个对象在另一个属性中具有相同的值,则更改对象的值

来自分类Dev

根据动态生成的另一个对象的属性计算对象的属性值的总和

来自分类Dev

C# 对象引用另一个对象的属性

来自分类Dev

如何访问本身是另一个对象的属性的对象的静态属性?

来自分类Dev

如何访问本身是另一个对象的属性的对象的静态属性?

来自分类Dev

如何访问分配给另一个对象的属性的数组内的对象的属性?

来自分类Dev

访问另一个对象内的对象属性

来自分类Dev

如何通过更改另一个属性的值来更改一个属性的值?(相关属性)

来自分类Dev

通过元素和另一个属性值获取 SimpleXML 对象中的属性值

来自分类Dev

如何检查数组对象的属性是否与另一个对象数组中的值之一匹配

来自分类Dev

如何从另一个对象的对象引用变量?

来自分类Dev

显示一个对象属性值,并在悬停时显示另一个

来自分类Dev

如何使用javascript根据另一个数组对象的属性值过滤对象数组

来自分类Dev

通过括号访问的Javascript对象属性分配了另一个属性的值?

来自分类Dev

更改另一个对象属性C#时,更改了不需要的对象属性

来自分类Dev

循环遍历另一个对象的属性的对象的值

来自分类Dev

使用Angular将对象属性(不带值)复制到另一个对象

来自分类Dev

在另一个对象中获取对象属性的值(描述)

来自分类Dev

如何检查一个对象是否嵌套在另一个对象的属性中作为属性?

来自分类Dev

如何更改JavaScript中对象属性之一传播到另一个的数组

来自分类Dev

如何从另一个属性访问对象文字属性?

Related 相关文章

  1. 1

    如何订阅rxjs中另一个对象中引用的对象的属性更改

  2. 2

    如何在同一Javascript对象中的另一个属性的值中引用一个属性?

  3. 3

    如果对象与另一个对象属性匹配,如何获取对象中的值

  4. 4

    在React中,如何使用另一个属性值获取对象的属性值?

  5. 5

    如果我有一个对象是另一个对象的属性,如何从该属性对象引用主对象?

  6. 6

    ng-model更改另一个对象的属性值的问题

  7. 7

    引用相同对象类型的另一个对象实例的类对象属性

  8. 8

    从另一个对象注册一个对象的属性更改

  9. 9

    JavaScript:如果另一个对象在另一个属性中具有相同的值,则更改对象的值

  10. 10

    根据动态生成的另一个对象的属性计算对象的属性值的总和

  11. 11

    C# 对象引用另一个对象的属性

  12. 12

    如何访问本身是另一个对象的属性的对象的静态属性?

  13. 13

    如何访问本身是另一个对象的属性的对象的静态属性?

  14. 14

    如何访问分配给另一个对象的属性的数组内的对象的属性?

  15. 15

    访问另一个对象内的对象属性

  16. 16

    如何通过更改另一个属性的值来更改一个属性的值?(相关属性)

  17. 17

    通过元素和另一个属性值获取 SimpleXML 对象中的属性值

  18. 18

    如何检查数组对象的属性是否与另一个对象数组中的值之一匹配

  19. 19

    如何从另一个对象的对象引用变量?

  20. 20

    显示一个对象属性值,并在悬停时显示另一个

  21. 21

    如何使用javascript根据另一个数组对象的属性值过滤对象数组

  22. 22

    通过括号访问的Javascript对象属性分配了另一个属性的值?

  23. 23

    更改另一个对象属性C#时,更改了不需要的对象属性

  24. 24

    循环遍历另一个对象的属性的对象的值

  25. 25

    使用Angular将对象属性(不带值)复制到另一个对象

  26. 26

    在另一个对象中获取对象属性的值(描述)

  27. 27

    如何检查一个对象是否嵌套在另一个对象的属性中作为属性?

  28. 28

    如何更改JavaScript中对象属性之一传播到另一个的数组

  29. 29

    如何从另一个属性访问对象文字属性?

热门标签

归档