繁体   English   中英

Python 类将值传递给“self”

[英]Python Class passing value to “self”

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

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, frequencies, *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(frequencies) 时,这会引发错误。 请记住,我还需要稍后在函数中使用 self,所以我不能只创建一个静态方法。

我从来没有遇到过类方法将任何值保存到“self”的问题。 我知道它必须在 Python 中显式声明,但是我传递给类方法的任何内容总是跳过“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, variant, frequencies, 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.frequencies, 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, pcov, infoRes in pool.starmap(run_variant,
                ((name, variant, frequencies, fit_vals) for variant in variants)):
            # do the other work here

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM