我有一個 python 檔案,其中包含一個抽象類和幾個子類。代碼如下所示
# test.py
import threading
from abc import ABC, abstractmethod
class Job(object):
def __init__(self, job_name):
self.job_name = job_name
def start(self):
self.run()
self.clean_up()
@abstractmethod
def run(self):
pass
@abstractmethod
def clean_up(self):
pass
class JobA(Job):
def __init__(self):
super().__init__('job_a')
print('JobA constructed')
def run(self):
print('%s: run for %s' % (self.__str__(), self.job_name))
def clean_up(self):
print('%s: clean up for %s' % (self.__str__(), self.job_name))
class JobB(Job):
def __init__(self):
super().__init__('job_b')
print('JobB constructed')
def run(self):
print('%s: run for %s' % (self.__str__(), self.job_name))
def clean_up(self):
print('%s: clean up for %s' % (self.__str__(), self.job_name))
if __name__ == '__main__':
jobs = [JobA(), JobB()]
threads = [threading.Thread(name=job.__str__(), target=lambda: job.start()) for job in jobs]
print(threads)
for t in threads:
print('starting thread %s' % t.name)
t.start()
這段代碼的輸出是
JobA constructed
JobB constructed
[<Thread(<__main__.JobA object at 0x1008a8f70>, initial)>, <Thread(<__main__.JobB object at 0x1008a8d90>, initial)>]
starting thread <__main__.JobA object at 0x1008a8f70>
<__main__.JobB object at 0x1008a8d90>: run for job_b
<__main__.JobB object at 0x1008a8d90>: clean up for job_b
starting thread <__main__.JobB object at 0x1008a8d90>
<__main__.JobB object at 0x1008a8d90>: run for job_b
<__main__.JobB object at 0x1008a8d90>: clean up for job_b
雖然為JobA 和JobB 的物件構造了兩個執行緒,但是start() 只在JobB 的物件上呼叫。
我希望應該在陣列中的不同物件上呼叫 start()。這段代碼有什么錯誤嗎?
謝謝。
我的 python 版本是達爾文上的 Python 3.9.7(默認,2021 年 10 月 12 日,22:38:23)[Clang 13.0.0 (clang-1300.0.29.3)]
uj5u.com熱心網友回復:
的lambda定義指的是回圈變數job的串列理解的(即,它定義了一個封閉件)。當 lambda 被呼叫時,它將決議該名稱job,該名稱現在指的是理解的最后一個元素(即作業 B)。
相反,您可以使用默認值,以便將理解的每個物件正確系結到相應的lambda函式:
threads = [threading.Thread(name=job.__str__(), target=lambda j=job: j.start()) for job in jobs]
考慮以下示例代碼以獲得更好的可視化效果:
>>> funcs = [lambda: print(x) for x in range(3)]
>>> for f in funcs:
... f()
...
2
2
2
>>> funcs = [lambda y=x: print(y) for x in range(3)]
>>> for f in funcs:
... f()
...
0
1
2
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/339635.html
標籤:Python 遗产 抽象类 python-3.9
上一篇:C中OO繼承的別名問題
