由于函数和属性访问(类似于私有(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_value
是 a
的方法。因此,调用 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/