python - 如何用原始类中的包装器调用替换每个函数调用?
问题描述
我有两个类,其中一个是另一个的包装器。原始类中的一个函数使用了一个名为 的方法forward
,但我希望它forward
在包装后使用包装类的方法,而不是原始的。例如:
class A:
def __init__(self):
self.a = 1
def forward(self, x):
return self.a + x
def main(self, x):
return self.forward(x) + 100
class Wrapper:
def __init__(self, A):
self.module = A
def forward(self, x):
# Long convoluted code.
# ..
# ..
return self.module.forward(x)
classA = A()
wrapperA = Wrapper(classA)
# Goal: Make classA.main(..) use the forward function from Wrapper instead.
因为包装类具有需要运行的冗长而复杂的代码,所以我希望对forward
from的所有调用都main
使其forward
从包装类调用,而不是从原始调用。
有没有办法在 Python 中做到这一点?
我不使用继承的原因:
实例化 A 类是内存密集型的。如果我收到 A 类对象作为输入,我想修改它的核心行为。无需实例化另一个对象。
classA
在运行时可以是不同的对象类型。
--
我想到的另一种方法是main
在Wrapper
. 但是,问题是自动为 A 中定义的每个方法执行此操作,而无需硬编码。
解决方案
您可以继承Wrapper
自A
,并用于super
访问父类。
class A:
def __init__(self, child):
self.a = 1
self.child = child
def forward(self, x):
return self.a + x
def main(self, x):
return self.child.forward(x) + 100
class Wrapper(A):
def __init__(self):
super(Wrapper, self).__init__(self, self)
def forward(x):
return "whatever"
wrapperA = Wrapper()
但如果你想使用类A
,只需继承A
自Wrapper
. 否则,我无法弄清楚什么是错的。请不要乱用函数。创建一个你想使用的类,另一个类作为家长,不要混合角色。
#...
class A(Wrapper):
def __init__(self):
super(A, self).__init__(self)
#...
推荐阅读
- c# - 在 Entity Framework 6 中合并实体
- symfony - Postgres 视图上的 Symfony 实体
- php - 创建父子关系 JSON 树
- node.js - 使用nodejs的方法更新sequelize with transaction
- java - 如何获取列表,将其收集到地图中,然后使用 Java Streams 进行排序?
- react-native - 如何限制 TextInput 中可以使用的符号?
- powerbi - Power BI:URL 过滤器中的嵌套 AND 语句
- mysql - MYSQL 解释'使用:where; 使用临时的;使用文件排序'
- tensorflow - 如何运行张量流 GPU
- python-3.x - 实例变量和数据属性