【问题标题】:How to update outer class attributes whenever inner class attributes change?每当内部类属性发生变化时如何更新外部类属性?
【发布时间】:2021-03-20 20:38:38
【问题描述】:

我有一个嵌套类,我想在内部类的属性发生更改时更新外部类的属性。 这是一个小例子:

class Outer:
    def __init__(self):
        self.statements = {}

    def add_statement(self, str_one, str_two):
        inner = self.Inner(self, str_one, str_two)
        self.statements[inner] = inner.sum
        return inner

    class Inner:
        def __init__(self, outer_inst, str_one, str_two):
            self.outer_inst = outer_inst
            self.str_one = str_one
            self.str_two = str_two

        @property
        def sum(self):
            return self.str_one + self.str_two

代码基本上会在使用add_statement 创建内部类时更新statements

>>> outer = Outer()
>>> inner = outer.add_statement("Hi", "Dog")
>>> inner.sum
"HiDog"
>>> outer.statements[inner]
"HiDog"

但是,假设我想改写inner.str_one = "Bye"。那么

>>> inner.str_one = "Bye"
>>> inner.sum 
"ByeDog"
>>> outer.statements[inner]
"HiDog"

这里的问题是outer.statements 没有更新。对于我的实际代码,它确实需要嵌套类,我希望它能够更新(相信这种行为对于我想要的构造来说是可取的)。 因此,当内部属性发生变化时,如何找到更新外部类属性的方法?

【问题讨论】:

  • 如果你调用create_inner 两次并且有两个Inner 实例......那么Outer 应该对应哪个......?
  • 两者一致?更新任何一个都会更新另一个。
  • i1 = outer.create_inner(...); i2 = outer.create_inner(...); i1.str_one = '1'; i2.str_one = '2'; outer.my_str — 现在呢?
  • 哦,我明白了,我误解了你的问题。这不是我在代码中实际执行的操作,因此看来我过于简化了 MWE。让我解决这个问题。
  • 基本上,Outer 类中有一个字典,其键和值取决于内部类实例的创建。每当内部类的实例之一出现时,都需要更新字典。

标签: python class inner-classes


【解决方案1】:

既然我想通了,我想我会分享它,以防它对其他人有用。使用下面的代码,任何外部类的任何更新都将自动更新Outer.my_dict。它基本上需要一个虚拟私有变量_my_dict。也许有更好的方法,但由于它被否决了,我们永远不会知道。

class Outer:
    def __init__(self):
        self._my_dict = {}

    @property
    def my_dict(self):
        statement_dict = {}
        for inner_obj in self._my_dict:
            statement_dict[inner_obj] = inner_obj.sum
        return statement_dict

    @my_dict.setter
    def my_dict(self, val):
        self._my_dict[val] = val.sum

    def create_inner(self, str_one, str_two):
        inner = self.Inner(self, str_one, str_two)
        self._my_dict[inner] = inner.sum
        return inner

    class Inner:
        def __init__(self, outer_inst, str_one, str_two):
            self.outer_inst = outer_inst
            self.str_one = str_one
            self.str_two = str_two

        @property
        def sum(self):
            return self.str_one + self.str_two

注意...

>>> outer = Outer()
>>> inner = outer.create_inner("Hi", "Dog")
>>> outer.my_dict.values()
dict_values(['HiDog'])
>>> inner.str_one = "Bye"
>>> outer.my_dict.values()
dict_values(['ByeDog'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2015-06-09
    • 2014-08-10
    相关资源
    最近更新 更多