类代理是python的透明代理

class_prox的Python项目详细描述


https://badge.fury.io/gh/herczy%2Fclass_proxy.svghttps://badge.fury.io/py/class_proxy.svghttps://travis-ci.org/herczy/class_proxy.svg?branch=master

简介

类代理可用于为任何值创建简单的代理对象。这个 代理可以是任何类。

例如,假设我们有一个解析器,并且需要能够知道 值来自(源文件名、行号和列)。我们可能有一个 来源处理此信息的类:

classSource(object):def__init__(self,filename,line,column):self.filename=filenameself.line=lineself.column=columndef__str__(self):return"file {}, line {}, column {}".format(self.filename,self.line,self.column)def__repr__(self):return"Source({!r}, {!r}, {!r})".format(self.filename,self.line,self.column)

如果我们将此源附加到我们控制的某个类,就没有问题。但是 如果我们想知道一个整数、字符串或任何标量、内置的 从哪来的?

解决方案是为标量类制作一个包装器:

importclass_proxyclassSourceValue(object):def__init__(self,source):self.source=sourcedef__str__(self):return"{} (from {})".format(class_proxy.instance(self),self.source)def__repr__(self):return"SourceValue({!r}, {!r})".format(class_proxy.instance(self),self.source)IntProxy=class_proxy.wrap_with(int,SourceValue)StrProxy=class_proxy.wrap_with(str,SourceValue)number=IntProxy(123,Source('example',1,2))print(number)# will print: 1 (from file example, line 1, column 2)string=StrProxy('hello',Source('example',5,7))print(repr(number))# will print: hello (from file example, line 5, column 7)other_number=IntProxy(456,Source('example',7,8))print(number<other_number)# will print: True

类代理实例调用将返回原始的、包装的 代理的实例。

用调用包装类proxy.wrap将创建一个proxy类 包装值作为第一个参数,而传递其余参数 到sourcevalue构造函数。

从代理类检索属性时(例如intproxy),它 将首先查找代理基类(例如sourcevalue),然后再查找 包装类(例如int)。这就是我们关心 我们要包装的类:我们也希望能够包装类,而不仅仅是 实例。

如果我们从实例中查找成员,首先我们将查找 从代理类的实例,然后从包装的类。

如果不关心类值,也可以省略包装的类:

GenericProxy=class_proxy.wrap_with(SourceValue)generic=GenericProxy(SomeGenericClass(1,2),Source('example',10,0))

在本例中,我们包装对象

还有一个方便的包装器,用于wrap_with函数,以防 您不需要为多个包装类定义它:

importclass_proxy@class_proxy.proxy_of(int)classIntProxy(object):defclamp(self,minval,maxval):ifself<minval:result=minvalelifself>maxval:result=maxvalelse:result=class_proxy.instance(self)returnIntProxy(result)value=IntProxy(50).clamp(-10,10)print(value)# will print: 10

它还有一个通用变体:

importclass_proxy@class_proxy.proxyclassProxy(object):defmap(self,func):returnfunc(class_proxy.instance(self))value=Proxy(100)print(value.map(lambdaval:-val))# will print: -100

灵感

类代理的灵感来自于 创建代理类。但是,padme有一些问题:

  • 它会产生大量的日志,这不仅会让人恼火,而且会产生奇怪的 尝试格式化日志字符串的包装值时的无限递归。
  • <> LI>手工编写的特殊方法,看起来像是 不必要的东西。

有了这些限制,我觉得有必要编写一个类似的工具 解决上述问题。

历史记录

1.1.0(2019-03-18)

    可以为绑定类代理指定自定义名称(默认情况下), 格式为<;proxy class>;[<;wrapped class>;])。

1.0.1(2019-03-10)

    为创建代理添加缓存。

1.0.0(2019-03-09)

  • 灵感来源于zyga/padme。
  • 写了基本代码。
  • 添加了文件以使其更为“project-y”。
  • 致力于github.com。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java计数步骤和操作   maven通过将第一个子类/jar添加到第二个子类路径,为一个子类创建jar,并为另一个子类执行goal exec:java   java JavaFX无法在ChoiceBox上调用setOnAction()?   swing使用Java,试图用图像显示JButton的可滚动列表,但显示的是文本而不是按钮   java无法读取跨行突出显示的确切文本   继承无法理解Java中super的功能   通过创建接口的模拟对象进行Java单元测试   活动布局中的java手指绘图?   java以看似随机的间隔获得NullPointerException,不知道为什么   java JButton位置不起作用   非序列化Java对象能否存储在mySQL BLob列中?   java如何使这个删除测试独立?   java Thymeleaf,无法访问该参数   java Solr CoreAware FilterFactory   java日志存储标准数据写入文件   socket上的java传递错误   java如何删除文件?   java Android有键盘小部件吗?   java方法,该方法将点对象作为参数,并根据其是否在直线段内返回true或false