【问题标题】:Python: dynamically create methods based on other classes'Python:基于其他类动态创建方法
【发布时间】: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代码或根本不提供代码...
  • 您要解决什么问题?可能有更好的方法来解决这个问题。

标签: python methods dynamic


【解决方案1】:

我认为您正在尝试在不使用/不了解其高级功能的情况下对 Python 进行高级使用,就像您在借鉴另一种语言的技术一样。

这不是批评,但你应该看看Python tutorialPython introspectionmetaclasses

我认为,如果您只是在Python functions 上完成您的知识,您将能够以更简单的方式轻松解决您的问题。

【讨论】:

    【解决方案2】:

    您应该更清楚地说明您想要实现的目标,而不是提出建议的解决方案。 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()”而不是手动编写函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多