【问题标题】:Access a subset of functions of a Python class访问 Python 类的函数子集
【发布时间】:2011-01-13 20:56:22
【问题描述】:

使用具有 xmlrpc 代理的类作为其对象的属性之一

def __init__(self):
    self.proxy = ServerProxy(...)
    # ...

我正在尝试简化某些代理功能的使用。应该只使用代理函数的一个子集,因此我想为它们创建一组微小的包装函数,比如

def sample(self):
    """ A nice docstring for a wrapper function. """
    self.proxy.sample()

有没有获得所有包装函数列表的好方法?我正在考虑类似 dir() 的东西,但是我需要过滤对象的包装函数。 xmlrpc introspection (http://xmlrpc-c.sourceforge.net/introspection.html) 也没有多大帮助,因为我不想使用/提供服务器的所有功能。

也许在包装器上设置一个属性以及 @staticmethod get_wrappers() 可以解决问题。使用 _wrapper 后缀不适合我的用例。类中跟踪可用的静态列表太容易出错。所以我正在寻找关于如何最好地获取包装函数列表的好主意?

【问题讨论】:

    标签: python xml-rpc


    【解决方案1】:

    使用 xml-rpc introspection 获取服务器列表并将其与对象的属性相交。比如:

    loc = dir(self)
    rem = proxy.listMethods() # However introspection gets a method list
    wrapped = [x for x in rem if x in loc]
    

    【讨论】:

      【解决方案2】:

      我不能 100% 确定这是否是您想要的,但它确实有效:

      def proxy_wrapper(name, docstring):
          def wrapper(self, *args, **kwargs):
              return self.proxy.__getattribute__(name)(*args, **kwargs)
          wrapper.__doc__ = docstring
          wrapper._is_wrapper = True
          return wrapper
      
      class Something(object):
          def __init__(self):
              self.proxy = {}
      
          @classmethod
          def get_proxy_wrappers(cls):
              return [m for m in dir(cls) if hasattr(getattr(cls, m), "_is_wrapper")]
      
          update = proxy_wrapper("update", "wraps the proxy's update() method")
          proxy_keys = proxy_wrapper("keys", "wraps the proxy's keys() method")    
      

      然后

      >>> a = Something()
      >>> print a.proxy
      {}
      >>> a.update({1: 42})
      >>> print a.proxy
      {1: 42}
      >>> a.update({"foo": "bar"})
      >>> print a.proxy_keys()
      [1, 'foo']
      >>> print a.get_proxy_wrappers()
      ['proxy_keys', 'update']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-14
        • 2021-05-09
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        • 2020-11-07
        • 2015-03-29
        • 1970-01-01
        相关资源
        最近更新 更多