首页 > 解决方案 > 在 Python 中创建类包装器

问题描述

我想做以下事情:给定一个类的实例,Base创建一个类的对象,该对象具有Wrapper该类的所有方法和属性Base+一些附加功能。

class Base:

    def __init__(self, *args, **kwargs):
         self.base_param_1 = ...
         # some stuff

    def base_method_1(self, *args, **kwargs):
         # some stuff

class Wrapper(...):

    def  __init__(self, cls_instance, *args, **kwargs):
        self.wrapper_param_1 = ...
        # some stuff

    def wrapper_method_1(self, *args, **kwargs):
        # some stuff

用例如下:

wrapper_obj = Wrapper(Base(*base_args, **base_kwargs), *wrapper_args, *wrapper_kwargs)

预期的行为是可以访问base_param_1, wrapper_param_1base_param_1base_param_2

重要的是Base类的字段在 Wrapper 中是相同的(不能复制)。

我已经看到可以通过这种方式添加新功能,将方法添加到现有对象实例,但这种方法有一些注意事项,不推荐使用。

在这里继承似乎不是一个选项,因为我是一个已经构造的对象Wrapper,尽管有共同的 Base,它可以采用不同的类。

编辑

还要求将Wrapper对象标识为Base实例。

标签: pythonwrapper

解决方案


您可以覆盖__getattr__. 这样,Wrapper首先查找特定属性,然后尝试包装对象的属性。

class Wrapper:
    def  __init__(self, base_obj, *args, **kwargs):
        self.base_obj = base_obj
        # some stuff

    def wrapper_method(self):
        return "new stuff"

    def __getattr__(self, name):
        return getattr(self.base_obj, name)
        
w = Wrapper("abc")
w.wrapper_method()
# 'new stuff'
w.upper()
# 'ABC'

推荐阅读