python属性的代理访问
Posted gj4990
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python属性的代理访问相关的知识,希望对你有一定的参考价值。
# -*- coding:utf-8 -*-
#由于方法二存在弊端,建议使用方法一
#方法一
class A:
def __init__(self):
print("A class initialization")
def f1(self):
print("A class -> f1 function")
def f2(self):
print("A class -> f2 function")
class B:
def __init__(self):
self._obj = A()
def f2(self):
print("B class -> f2 function")
#__getattr__() 实际是一个后备方法,只有在属性不存在时才会调用。
# 因此,如果代理类实例本身有这个属性的话,那么不会触发这个方法的。
def __getattr__(self, name):
return getattr(self._obj, name)
#方法二: 代理模式
class Proxy:
def __init__(self, obj):
self._obj = obj
def __getattr__(self, name):
print("Proxy class -> __getattr__ function")
return getattr(self._obj, name)
def __setattr__(self, name, value):
print("Proxy class -> __setattr__ function")
if name.startswith('_'):
super().__setattr__(name, value)
else:
setattr(self._obj, name, value)
def __delattr__(self, name):
print("Proxy class -> __delattr__ function")
if name.startswith('_'):
super().__delattr__(name)
else:
delattr(self._obj, name)
class C:
def __init__(self, a):
#注意使用Proxy作为代理时,被代理类(如C)的属性的名字不能设置为
#下划线开头的,如果设置为下划线开头的属性名字,则所有的操作都
#属于代理类(如Proxy),这些操作不会被应用到被代理类(如C)中
self.a = a
def main():
obj1 = B()
obj1.f2()
obj1.f1()
obj2 = C(10)
p = Proxy(obj2)
print("C class a value: 0. Proxy class a value: 1".format(obj2.a, p.a))
p.a = 20
print("C class a value: 0. Proxy class a value: 1".format(obj2.a, p.a))
if __name__ == "__main__":
main()
运行结果:
A class initialization
B class -> f2 function
A class -> f1 function
Proxy class -> __setattr__ function
Proxy class -> __getattr__ function
C class a value: 10. Proxy class a value: 10
Proxy class -> __setattr__ function
Proxy class -> __getattr__ function
C class a value: 20. Proxy class a value: 20
以上是关于python属性的代理访问的主要内容,如果未能解决你的问题,请参考以下文章