为什么@property中断了与代理类上的源对象的同步

时间:2019-02-27 22:04:26

标签: python python-3.x

由于功能和属性的访问(例如私有),我想在Python中创建代理。我使用对源对象中函数的引用创建代理。但是我有一个问题,函数更改属性没有问题,但是属性可以。这是一个示例:

工作示例

class A:
    def __init__(self):
        self.value = 1

    def get_value(self):
        return self.value

class Proxy:
    def __init__(self, cls):
        self.get_value = cls.get_value
        # del cls

a = A()
p = Proxy(a)

print(a.get_value(), p.get_value())
a.value = 2
print(a.get_value(), p.get_value())

输出:

1 1
2 2

不起作用:

class A:
    def __init__(self):
        self.value = 1

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

class Proxy:
    def __init__(self, cls):
        self.get_value = cls.get_value
        # del cls

a = A()
p = Proxy(a)

print(a.get_value, p.get_value)
a.value = 2
print(a.get_value, p.get_value)

输出:

1 1
2 1

有人可以向我解释问题出在哪里,是否有解决方案?我可以使用函数,但是我认为@property是更多的Python解决方案。我真的想知道有什么区别。谢谢

1 个答案:

答案 0 :(得分:0)

Proxy.__init__中,您最终执行:

self.get_value = a.get_value

在两个示例中发生的事情非常不同。

在第一种情况下,a.get_valuea的方法。因此,调用p.get_value()与调用a.get_value()相同。您得到相同的结果。

在第二种情况下,您已经将a.get_value定义为属性,因此self.get_value = a.get_value基本上是self.get_value = 2,它只是{{1}的int属性}。