【问题标题】:Python: detect changes in a subclassPython:检测子类的变化
【发布时间】:2022-01-07 23:16:11
【问题描述】:

让我们考虑以下示例:

class SubClass:
    def __init__(self):
        self._param = None

    @property
    def param(self):
        print('read param')
        return self._param

    @param.setter
    def param(self, value):
        print('set param')
        self._param = value


class MainClass:
    def __init__(self):
        self._var = SubClass()

    @property
    def var(self):
        print('read var')
        return self._var

    @var.setter
    def var(self, value):
        print('set var')
        self._var = value

如果我这样做:

cls = MainClass()
cls.var.param = 3

我得到:

'read var'
'set param'

如何让MainClass 知道var.param 已更改?

有用的附加信息:考虑到在我的实际代码中param 不是一个标量,而是一个包含数百个元素的数组,所以我想避免创建一个副本然后只比较它们。此外,paramvar 并不是唯一的属性。

【问题讨论】:

  • 为什么首先需要这个?对我来说似乎是一个 XY 问题
  • 为了简单起见,因为我需要在MainClass 中进行一些操作,但前提是var.param 已更改。
  • 您可以考虑使用观察者类来跟踪更改。参见例如stackoverflow.com/questions/22878220/…

标签: python-3.x class subclass


【解决方案1】:

一种方法是在实例化SubClass 时将来自MainClass 的方法作为参数传递,并让SubClass 在更改变量时调用它:

class SubClass:
    def __init__(self, changed):
        self._param = None
        self.changed = changed

    @property
    def param(self):
        print('read param')
        return self._param

    @param.setter
    def param(self, value):
        print('set param')
        self._param = value
        self.changed('param')


class MainClass:
    def __init__(self):
        self._var = SubClass(self.changed)
    
    def changed(self, name):
        print("Subclass changed: ", name, getattr(self._var, name))

    @property
    def var(self):
        print('read var')
        return self._var

    @var.setter
    def var(self, value):
        print('set var')
        self._var = value


m = MainClass()
m.var.param = 'test'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多