簡體   English   中英

Python:基於其他類動態創建方法

[英]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)

希望現在更清楚...

我認為您正在嘗試不使用/不了解Python的高級功能而對Python進行高級使用,就像您從另一種語言中借用了技術一樣。

這並不是批評,但是您應該看一下Python教程Python自省元類

我認為,如果您只了解Python函數,那么您將能夠以更簡單的方式輕松解決問題。

與其生成提議的解決方案,不如讓其更清楚地說明您要實現的目標。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM