代码之家  ›  专栏  ›  技术社区  ›  Gerald Senarclens de Grancy

访问Python类的函数子集

  •  3
  • Gerald Senarclens de Grancy  · 技术社区  · 16 年前

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

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

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

    也许将包装器上的属性与@staticmethod get_wrappers()一起设置就可以做到这一点。使用_包装后缀不适合我的用例。类中跟踪可用数据的静态列表太容易出错。所以我在寻找关于如何最好地获得包装器函数列表的好主意?

    2 回复  |  直到 16 年前
        1
  •  3
  •   balpha    16 年前

    我不能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']
    
        2
  •  2
  •   user261840    16 年前

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

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