python - 在 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_1
和
base_param_1
,base_param_2
。
重要的是Base
类的字段在 Wrapper 中是相同的(不能复制)。
我已经看到可以通过这种方式添加新功能,将方法添加到现有对象实例,但这种方法有一些注意事项,不推荐使用。
在这里继承似乎不是一个选项,因为我是一个已经构造的对象Wrapper
,尽管有共同的 Base,它可以采用不同的类。
编辑
还要求将Wrapper
对象标识为Base
实例。
解决方案
您可以覆盖__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'
推荐阅读
- reactjs - Material UI 创建全屏交错网格布局
- java - 关于 JdbcTemplate 中的 batchUpdate 方法
- node.js - 在运行时动态更改猫鼬连接
- node.js - 开发聊天机器人并与移动应用程序连接
- python - 无法读取请求模块 - ModuleNotFoundError:没有名为“请求”的模块
- java - 当您想将字符串限制为特定输入时,如何要求程序重复?
- r - R在同一引用类对象的多个实例上调用函数
- informatica - infornatica 中是否有 NOT LIKE 函数?
- javascript - Javascript 文件未与 HTML 一起加载
- google-sheets - 如何使用 VLOOKUP 返回 2 个单元格?