簡體   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