我有很多类,如SpaceA
、SpaceB
、SpaceC
等。这些类有一些类似的方法,例如method_1
、method_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))
这可以完全解决我的问题。