由于功能和属性的访问(例如私有),我想在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解决方案。我真的想知道有什么区别。谢谢
答案 0 :(得分:0)
在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
,它只是{{1}的int
属性}。