当前位置: 首页 > 面试题库 >

Python中的代理对象

堵远航
2023-03-14
问题内容

我正在寻找将方法调用从对象(包装器)传递到对象(包装器)的成员变量的方法。可能有许多方法需要外部化,因此在将方法添加到包装中时,无需更改包装器接口即可做到这一点。

class Wrapper(object)
  def __init__(self, wrappee):
    self.wrappee = wrappee

  def foo(self):
    return 42

class Wrappee(object):
  def bar(self):
    return 12

o2 = Wrappee()
o1 = Wrapper(o2)

o1.foo() # -> 42
o1.bar() # -> 12
o1.<any new function in Wrappee>() # call directed to this new function

如果此呼叫重定向是“快速”的(相对于直接呼叫,即不增加太多开销),那将是很好的。


问题答案:

一个比较优雅的解决方案是在包装类上创建“属性代理”:

class Wrapper(object):
    def __init__(self, wrappee):
        self.wrappee = wrappee

    def foo(self):
        print 'foo'

    def __getattr__(self, attr):
        return getattr(self.wrappee, attr)


class Wrappee(object):
    def bar(self):
        print 'bar'

o2 = Wrappee()
o1 = Wrapper(o2)

o1.foo()
o1.bar()

所有的魔术都发生在类的__getattr__方法上,该方法Wrapper将尝试访问Wrapper实例上的方法或属性,如果不存在,则将尝试包装的方法或属性。

如果您尝试访问两个类都不存在的属性,则会得到以下信息:

o2.not_valid
Traceback (most recent call last):
  File "so.py", line 26, in <module>
    o2.not_valid
  File "so.py", line 15, in __getattr__
    raise e
AttributeError: 'Wrappee' object has no attribute 'not_valid'


 类似资料:
  • 问题内容: 我打开网址: 我想做的就是以相同的方式连接到我在某处告诉我的代理: 但这也不起作用。 我知道urllib2具有类似代理处理程序的功能,但是我无法回忆起该功能。 问题答案:

  • 我正尝试使用selenium使用我找到的代码更改我的IP,但出现错误:selenium.Common.Exceptions.WebDriverException:消息:“ChromeDriver”可执行文件需要在PATH`From selenium import webdriver中 PROXY=“23.23.23.23:3128”#IP:端口或主机:端口

  • 在数学中,集合表示由一个或多个确定的元素所构成的整体。在 Python 中,列表、元组、集合可以用于表示数学中的集合。 例如,分别使用列表、元组、集合表示了一个包含 3 个字符串的集合: 列表 [‘www’, ‘imooc’, ‘com’] 元组 (‘www’, ‘imooc’, ‘com’) 集合 {‘www’, ‘imooc’, ‘com’} 1. 可迭代对象 iterable 1.1 什么是

  • 问题 你想写C扩展代码处理来自任何可迭代对象如列表、元组、文件或生成器中的元素。 解决方案 下面是一个C扩展函数例子,演示了怎样处理可迭代对象中的元素: static PyObject *py_consume_iterable(PyObject *self, PyObject *args) { PyObject *obj; PyObject *iter; PyObject *item;

  • 问题内容: 我有很多自定义对象,需要对其执行独立(可并行化)的任务,包括修改对象参数。我试过同时使用Manager()。dict和’sharedmem’ory,但都没有用。例如: 打印出: 即对象没有被修改。 如何实现所需的行为? 问题答案: 问题在于,当将对象传递给工作进程时,它们会被泡菜包装,运送到另一个过程中,然后在其中解压缩并进行处理。您的对象没有像克隆的那样传递给其他过程。您不返回对象,

  • 本文向大家介绍Python实现的异步代理爬虫及代理池,包括了Python实现的异步代理爬虫及代理池的使用技巧和注意事项,需要的朋友参考一下 使用python asyncio实现了一个异步代理池,根据规则爬取代理网站上的免费代理,在验证其有效后存入redis中,定期扩展代理的数量并检验池中代理的有效性,移除失效的代理。同时用aiohttp实现了一个server,其他的程序可以通过访问相应的url来从