Python中最简单的转发类定义是什么?

2024-04-23 18:51:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在Python中实现一个转发类,实现一些基类,在它的构造函数中引入同一基类的另一个实现,然后针对基类中的每个方法转发到该类。在

这对于提供定制点非常有用,可以为某些方法添加缓存,在每个调用站点上进行日志记录等等。在

手工写这个很简单。给定这个基类:

class BaseClass(object):
    def method_a(self, *args):
        pass

    @property
    def prop_b(self):
        pass

    def method_c(self, a, b, **kwargs):
        pass

下面是一个简单的转发实现。在

^{pr2}$

编写代码的缺点是有很多样板代码,并且必须为每个方法编写这些代码。当方法被添加到基类中时,类似的代码必须被添加到转发类中;如果需要更改类的转发方式,则必须在所有方法中传播这些更改。(例如,想象一下,我们希望更改类,以便它使用一个上下文管理器来处理每个调用。)

有没有一种简短的python方法来实现这一点,要么使用基本语言,要么使用内置模块,要么使用PyPI上的一些可靠模块?在

所需功能:

  • 精确方法签名
    • 转发的签名应与基类匹配
    • 每个签名上都没有*args, **kwargs
  • 使用@property修饰符的方法被正确包装
  • __<method>__方法(如果存在)被正确包装
  • 在直接实现过程中,每个方法调用没有额外的成本
  • dir(instance)执行的操作与直接实现相同

很高兴有:

  • 基类不满足某些必要条件的错误消息
  • 有意义的docstring
  • 从结果对象派生的能力
  • 带有@staticmethod修饰符的方法被转发到传入实现的类
  • 带有@classmethod修饰符的方法被转发到传入实现的类
  • __init__和{}不被转发

可能存在额外复杂性的地方:

  • 基类有一个元类
  • 基类有自己的多个基类
  • 一些更深奥的__<method>__及其语义

不在乎:

  • 多个基类
  • 自定义描述符修饰符,而不是@property@staticmethod和{}
  • 转发类创建后对基类的修改

Tags: 模块方法代码self站点def记录args
1条回答
网友
1楼 · 发布于 2024-04-23 18:51:25

只是为了澄清我的意见:我的意思是+/-这个(需要更多的工作,尽管。。。再次强调:可能无法满足您的所有要求):

class BaseClass(object):
    def method_a(self, *args):
        pass

    @property
    def prop_b(self):
        pass

    def method_c(self, a, b, **kwargs):
        pass

class ForwardBaseClass(BaseClass):
    def __init__(self, underlying_implementation):
        self._impl = underlying_implementation

    def __getattr__(self, name):
        # here you may have to exclude thigs; i.e. forward them to
        # self.name instead for self._impl.name
        try:
            return getattr(self._impl, name)
        except AttributeError:
            # do something else...

bc = BaseClass()
fbc = ForwardBaseClass(bc)
print(fbc.prop_b)
print(fbc.method_c(1,2,c=5))
print(dir(fbc))

请注意,由于python name mangling,您将无法以这种方式访问以__开头的成员。在

相关问题 更多 >