如何在 Python 中将 A 类的方法包装为 B 类的方法?



我有很多类,如SpaceASpaceBSpaceC等。这些类有一些类似的方法,例如method_1method_2、...、method_n。但是对于特定的类,它可能没有实现所有method_i。下面是一个示例:

import numpy as np
class SpaceA(object):
def method_1(self, array, b, c=None):
print('method_1', array, b, c)
def method_2(self, array, b, c=None):
print('method_2', array, b, c)
def method_3(self, array, b, c=None):
print('method_2', array, b, c)
... # many methods
class SpaceB(object):
...
def method_1(self, array, b, c=None):
print('method_1', array, b, c)
def method_2(self, array, b, c=None):
print('method_2', array, b, c)
def method_3(self, array, b, c=None):
print('method_2', array, b, c)
... # many methods

我想定义另一个名为Function类,如下所示:

class Function(np.ndarray):
def __new__(cls, space, array=None):
if array is None:
self = np.zeros(100).view(cls)
else:
self = array.view(cls)
self.space = space
return self
def method_1(self, b, c=None):
return self.space.method_1(self, b, c=c)
def method_2(self, b, c=None):
return self.space.method_2(self, b, c=c)
... # many wrapper
A = SpaceA()
B = SpaceB()
fA = Function(A)
fB = Function(B)

我想自动将特定类的每个method_i包装到Function类中,可能吗? 以及如何?

也许__metaclass__可以解决我的问题,但我不会成功。

非常感谢@quamrana的评论,我编写了一个新的Function类,如下所示:

import numpy as np
from types import ModuleType
class Function(np.ndarray):
def __new__(cls, space, dim=None, array=None):
if array is None:
self = space.array(dim=dim).view(cls)
else:
self = array.view(cls)
self.space = space
return self
def index(self, i):
return Function(self.space, array=self[:, i])
def __call__(self, bc, index=None):
space = self.space
return space.value(self, bc, index=index)
def value(self, bc, index=None):
space = self.space
return space.value(self, bc, index=index)
def __getattr__(self, item):
def wrap(func):
def outer(*args,  **kwargs):
val = func(self, *args, **kwargs)
return val
outer.coordtype = func.coordtype
return outer 
if hasattr(self.space, item):
self.__dict__[item]= wrap(getattr(self.space, item))
return self.__dict__[item]
else:
print('The function space has not implemented method {}'.format(item))

这可以完全解决我的问题。

最新更新