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

标签 python python-3.x

由于函数和属性访问(类似于私有(private)),我想在 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 解决方案。我真的很想知道有什么区别。谢谢

最佳答案

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,它只是p的一个int属性。

关于python - 为什么 @property 中断了与代理类上的源对象的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54915217/

相关文章:

python - Snakebite HDFS touchz 不工作

python - PyDict_SetItemString 段错误

python - 在 Flask 上注册用户时发送邮件时出现循环导入问题

python-3.x - 无法将我的 Pandas 数据框导出到 excel

python - 为什么 Python 的 eval() 拒绝这个多行字符串,我该如何修复它?

python - 有没有办法将 python nos2 映射到安装在自定义位置的覆盖插件?

python - 将数据框转换为python中的列表列表

c++ - GDB Python 支持,ImportError 没有名为 gdb 的模块

Python:加载 kmeans 训练数据集并使用它来预测新数据集

python-3.x - 星期几程序 Python3