我的代码中实现了很多类.现在我意识到,对于为所有这些类调用的每个方法,我需要添加一行:
with service as object:
Run Code Online (Sandbox Code Playgroud)
所以我试图使用代理模式自动完成工作,这是我的示例代码
class A(object):
def __init__(self, name):
self.name = name
def hello(self):
print 'hello %s!' % (self.name)
def __enter__(self):
print 'Enter the function'
return self
def __exit__(self, exc_type, exc_value, traceback):
print 'Exit the function'
class Proxy(object):
def __init__(self, object_a):
# object.__setattr__(self, '_object_a', object_a)
self._object_a = object_a
def __getattribute__(self, name):
service = object.__getattribute__(self, '_object_a')
with service as service:
result = getattr(service, name)
return result
if __name__=='__main__':
a1 = A('A1')
b = Proxy(a1)
b.hello()
a2 = A('A2')
b …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现类似容器的nD数组。可以包装基础序列容器并允许将其作为(of ...)容器的容器进行处理的东西:arr[i][j][k]应该是的(最终const)引用_arr[(((i * dim2) + j) * dim3) + k]。
好的,直到那里,arr[i]只是在子数组上有一个包装类。
当我尝试实施干预者时,我突然意识到周围到处都是龙:
operator []返回了代理或包装而不是真实的引用(什么时候容器不是容器?)真正的问题是,一旦有了代理容器,任何迭代器都无法满足对转发迭代器的以下要求:
转发迭代器[forward.iterators]
...
6如果a和b都是可取消引用的,则a == b仅当*a和*b绑定到同一对象时,则。
示例来自标准库本身:
vector<bool> 众所周知,它不遵守容器的所有要求,因为它返回代理而不是引用:
class vector [vector.bool]
...
3不需要将数据存储为bool值的连续分配。建议使用空间优化的位表示形式。
4 reference是模拟向量中单个位的引用行为的类。
文件系统路径迭代器是隐藏式迭代器:
path迭代器[fs.path.itr]
...
2 path :: iterator是一个常量迭代器,它满足双向迭代器(27.2.6)的所有要求,但对于可取消引用的迭代器a以及bpath :: iterator类型,a == b …
至少在java中,代理模式有很多开销 - 我不记得确切的数字,但是当包装微小方法时,代理需要花费50倍于包装方法的时间.这是,例如,为什么java.awt.image.BufferedImage.setRGB&getRGB是真的慢; 有大约三个代理包装实际byte[].
为什么50次?!为什么代理不会加倍?
正如SO似乎常见的那样,我得到了一堆答案,告诉我我的问题是错的.不是.查看BufferedImage或其他一些真正的代理模式,而不是那些微基准测试.事实上,如果你必须对BufferedImage进行大量像素操作并且你知道它的结构,你可以通过手动撤消代理来实现所谓的巨大加速; 看到这个答案.
哦,这是我50倍的来源.正如文章详细说明的那样,代理在包装需要很长时间时没有明显的损失,但是如果你用一个小方法包装它们确实会产生很大的痛苦.
我研究JavaScript代理模式,但我仍然没有,我可以从中受益.因此,我想向您提供两个例子,请您指出它们之间的区别.
请看下面的代码:
addEventListener电话有什么区别?其中一个人handleDrop定期打电话.另一个使用代理模式.我测试了两个函数,它们都handleDrop成功调用了.
DndUpload.prototype.buildDropZone = function ()
{
var self = this,
this.dropZone.addEventListener('drop', function (e) { self.handleDrop.call(self, e) }, false);
this.dropZone.addEventListener('drop', self.handleDrop, false);
DndUpload.prototype.handleDrop = function (e)
{
alert("test");
...
};
}
Run Code Online (Sandbox Code Playgroud)
您可以为我提供很好的参考,其中包含JavaScript中代理模式的非常清晰的解释.
提前致谢.