Python类将值传递给“自身”

问题描述

我正在编写一个优化器,该优化器必须经过几种可能的变体。团队希望实现多线程以更快地通过这些变体。这意味着我必须将所有函数放入线程类中。我的问题是包装函数的调用

class variant_thread(threading.Thread):
    def __init__(self,name,variant,frequencies,fit_vals):
        threading.Thread.__init__(self)
        self.name = name
        self.elementCount = variant
        self.frequencies = frequencies
        self.fit_vals = fit_vals
    
    def run(self):
        print("Running Variant:",self.elementCount) # display thread currently running
        fitFunction = self.Wrapper_Function(self.elementCount)
    
        self.popt,pcov,self.infoRes = curve_fit_my(fitFunction,self.frequencies,self.fit_vals)

    def Optimize_Wrapper(self,*params): # wrapper which returns values in manner which optimizer can work with
        cut = int(len(frequencies)/2) <---- ERROR OCCURS HERE
        freq = frequencies[:cut]
        vals = (stuff happens here)
        return (stuff in proper form for optimizer)

为了简化示例,我已尽力而为,并且希望您能理解正在发生的事情。本质上,在创建线程之后,它将调用优化器。优化器会将要更改的频率和参数列表发送到Optimize_Wrapper函数。

问题在于,Optimize-Wrapper采用了频率列表并将其保存为“ self”。这意味着“频率”变量变为单个浮点值,而不是应为的浮点列表。当然,当我尝试取len(频率)时,这会引发错误。请记住,稍后我还需要在函数中使用self,所以我不能只创建静态方法。

我从来没有遇到过这样的问题:类方法将任何值保存到“ self”。我知道必须在Python中显式声明它,但是我传递给class方法的所有内容始终会跳过“ self”并保存到声明的变量中。这是怎么回事?

解决方法

不要将实例变量传递给方法。它们已经可以通过self访问。并且要注意哪个变量是哪个。 Wrapper_function的第一个参数称为“频率”,但您将其称为self.Wrapper_Function(self.elementCount)-因此,您有一个self.frequency和一个frequency ...,它们是不同的东西。非常令人困惑!

class variant_thread(threading.Thread):
    def __init__(self,name,variant,frequencies,fit_vals):
        threading.Thread.__init__(self)
        self.name = name
        self.elementCount = variant
        self.frequencies = frequencies
        self.fit_vals = fit_vals
    
    def run(self):
        print("Running Variant:",self.elementCount) # display thread currently running
        fitFunction = self.Wrapper_Function()
        self.popt,pcov,self.infoRes = curve_fit_my(fitFunction,self.frequencies,self.fit_vals)

    def Optimize_Wrapper(self): # wrapper which returns values in manner which optimizer can work with
        cut = int(len(self.frequencies)/2) <---- ERROR OCCURS HERE
        freq = self.frequencies[:cut]
        vals = (stuff happens here)
        return (stuff in proper form for optimizer)

您不必继承Thread来运行线程。定义一个函数并让Thread调用该函数通常更容易。在您的情况下,您可以将变体处理放入函数中并使用线程池运行它们。这样可以节省线程对象本身的所有繁琐处理。

def run_variant(name,fit_vals):
    cut = int(len(self.frequencies)/2) <---- ERROR OCCURS HERE
    freq = self.frequencies[:cut]
    vals = (stuff happens here)
    proper_form = (stuff in proper form for optimizer)
    return curve_fit_my(fitFunction,self.fit_vals)

if __name__ == "__main__":
    variants = (make the variants)
    name = "name"
    frequencies = (make the frequencies)
    fit_vals = (make the fit_vals)
    from multiprocessing.pool import ThreadPool
    with ThreadPool() as pool:
        for popt,infoRes in pool.starmap(run_variant,((name,fit_vals) for variant in variants)):
            # do the other work here

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...