从班级外部修改班级属性

时间:2018-08-12 17:27:41

标签: python python-3.x pyqt pyqt5

要在基于pyqt5的应用程序中使用,我想提出一种将对象的属性绑定到QWidget的机制(单向-以便通过<属性的任意更新触发qt小部件上的更新strong>另一个对象)。

我想使表示的类不知道其表示形式,以便可以与其他GUI框架等重用。

由于这个原因,使用信号/插槽的解决方案并不理想,因为所表示的类需要继承自QObject才能定义和发出信号(QWidget类可以捕获该信号)。

我能找出的最好的方法如下,其中A是表示的类,B是表示的类(将从QWidget继承,但为简单起见,在示例中可以忽略)

class A:
    def __init__(self):
        self._prop = 0

    @property
    def prop(self):
        print("getting prop from A")
        return self._prop

    @prop.setter
    def prop(self, v):
        print("setting prop from A")
        self._prop = v

class B:
    def __init__(self, a):
        a_getter = type(a).prop.fget
        a_setter = type(a).prop.fset

        def b_getter(obj):
            a_getter(obj)
            print("B's hook in A - getter")

        def b_setter(obj, v):
            a_setter(obj, v)
            print("B's hook in A - setter")

        type(a).prop = property(b_getter, b_setter)

在初始化过程中,B获得了它应该表示的A的实例,并通过添加一些操作(对gui的更新)来“扩展” A的prop getter和setter。

用途为:

>>> a = A()
>>> a.prop
getting prop from A
>>> a.prop = 1
setting prop from A    
>>> b = B(a)
>>> a.prop
getting prop from A
B's hook in A - getter
>>> a.prop = 2
setting prop from A
B's hook in A - setter

此解决方案似乎可以正常工作,但我不确定修改classe属性的整个想法是否是个好/安全的想法。

是否存在一种更好的方法来实现相同的效果,同时保持“代表-代表”的分离?您对我提出的解决方案有任何疑问吗?

0 个答案:

没有答案