[英]Python: dynamically create methods based on other classes'
我已經尋找了很長時間,但找不到我的問題的正確答案:我有一個包含對數組進行操作的方法的類,並且我想在另一個具有修改后的輸出的類中動態創建名稱相似的方法。
到目前為止,我有這樣的事情,有人可以指導我嗎?
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類包含過濾器,采用數組並將過濾器作為方法,返回過濾后的數據。
類filter()
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 = [如果元素[0]!='_',則dir(過濾器)中元素的元素]
過濾器名稱中的擬合器名稱: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)])它返回方法作為第二個元素,而不是結果。
請注意以下工作,但這不是我想要的...自我。 字典 [fitlername] = getattr(filters(self.data [1]),fitlername)
希望現在更清楚...
與其生成提議的解決方案,不如讓其更清楚地說明您要實現的目標。 A類是起點的明顯例子; 請發布您想要的終點的示例,例如
Class B():
def__init__(self,array):
self.data = array
def method1(self,*args):
newarray = ComplexWhatever(self.data,*args)
return newarray
def method2(self,*args):
newarray = EvenBiggerWhatever2(self.data,*args)
return newarray
a = A(input_array)
b = B(input_array)
print(a.method1(args))
print(b.method1(args))
還不清楚您想如何“動態生成”新函數“ ComplexWhatever()”,而不是手動編寫函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.