【发布时间】:2011-12-30 10:47:51
【问题描述】:
我已经找了很长时间,但找不到我的问题的正确答案: 我有一个包含对数组进行操作的方法的类,我想在另一个类中动态创建具有相似名称的方法,并修改输出。
到目前为止,我有类似的东西,有人可以指导我吗?
谢谢
Class A():
def__init__(self,array):
self.data = array
def method1(self,*args):
newarray = whatever(self.data,*args)
return newarray
def method2(self,*args):
newarray = whatever2(self.data,*args)
return newarray
我希望能够使用这些方法在更复杂的类中生成新方法,例如:
class B(C): #inherits from C
def __init__(self,[arg1,array]):
#initialize from parent class
C.__init__(self,[arg1,array])
#create new methods for this class using same name
methodnames = [element for element in dir(A) if element[0] != '_']
for methodname in methodnames:
##following works but this is not the output I want here
#self.__dict__[methodname] = getattr(A(array),methodname)
#following doesn't work... at least not as I expect it to
#case1
#self.__dict__[methodname] = [arg1,getattr(A(array),methodname)]
#case2
self.__dict__[methodname] = list([arg1,getattr(A(array),methodname)])
a = array
#following returns a list of [arg1, method] but what I really want is [arg1,newarray]
C([arg1,array]).method1(*args)
好的,让我们试着更清楚一点:
A 类包含过滤器,接受一个数组并将过滤器作为方法应用,返回过滤后的数据。
类过滤器()
def__init__(self,array):
self.data = array
def filter1(self,*args):
newarray = median(self.data,*args)
return newarray
def filter2(self,*args):
newarray = gaussian(self.data,*args)
return newarray
...
在另一个模块中,我有一个 SpecialData 类,它对 x,y 数据列表进行操作(其中 x 和 y 是可迭代的,即列表、数组......)。所以像
类 SpecialData():
def __init__(self,[x,y]):
self.data = [x,y]
def power(self,power):
ypow = self.data[1]**power
return [x,pow]
def porod(self):
return [x**4,x**4*y]
....
现在,我想要将类过滤器中包含的过滤器方法添加到类 SpecialData。 当然,我可以通过使用 SpecialClass 的正确格式重新编码所有过滤器来做到这一点。但我真正想要的是,每次将新过滤器添加到类过滤器时,使其在运行时在类 SpecialData 中可用,而无需重新对新过滤器进行硬编码。
所以,不是很聪明,我尝试通过以下方式阅读类过滤器中的可用过滤器列表:
导入过滤器
filternames = [dir(filters) 中元素的元素 if element[0] != '_']
对于 filternames 中的 fitlername: generate_filters_in_class_SpecialClass
我该如何正确地做到这一点?
我发现了一些与此相关的帖子,一些使用 super(),另一些使用 SpecialData.dict 甚至 setattr。由于第二个对我来说似乎更容易理解,所以我专注于这个并想出了:
导入过滤器
类 SpecialData():
def __init__(self,[x,y]):
self.data = [x,y]
filternames = [element for element in dir(filters) if element[0] != '_']
for fitlername in filternames:
self.__dict__[fitlername ] = [self.data[0],getattr(filters(self.data[1]),fitlername)]
当然,这是行不通的,因为列表是不可调用的。如果我将最后一行更改为: self.dict[fitlername ] = list([self.data[0],getattr(filters(self.data[1]),fitlername)]) 它将方法作为第二个元素返回,而不是结果。
请注意,以下内容有效,但这不是我想要的... self.dict[fitlername ] = getattr(filters(self.data[1]),fitlername)
希望现在更清楚...
【问题讨论】:
-
1-无法理解您的要求...,-2-请提供有效的python代码或根本不提供代码...
-
您要解决什么问题?可能有更好的方法来解决这个问题。