繁体   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