【发布时间】:2017-10-28 18:54:04
【问题描述】:
如何在不编辑初始值且不将属性作为参数传递的情况下在调用其他方法的线程中使用某些类属性?
“first”和“second”值必须始终等于“init”值,并且“third”和“fourth”必须都相等。
这个例子显示了最初的问题:
from concurrent.futures import ThreadPoolExecutor
from random import random
from time import sleep
class main():
def __init__(self):
self.var = random()
print('init', self.var)
def first(self):
print('first', self.var)
self.second()
print('fourth', self.var)
def second(self):
print('second', self.var)
self.var = random()
print('third', self.var)
sleep(1)
m = main()
with ThreadPoolExecutor() as executor:
executor.submit(m.first)
executor.submit(m.first)
executor.submit(m.first)
使用该方法将 self.var 分配给另一个属性显然不起作用:
class main():
def __init__(self):
self.var = random()
print('init', self.var)
def first(self):
self.var2 = self.var
print('first', self.var2)
self.second()
print('fourth', self.var2)
def second(self):
print('second', self.var2)
self.var2 = random()
print('third', self.var2)
sleep(1)
我尝试的唯一解决方案是将属性分配给局部变量并将其作为参数传递给被调用函数。就我而言,这不是一个好的解决方案,因为我需要传递大量属性并且代码会迅速增加并且开始变得不那么可读。
class main():
def __init__(self):
self.var = random()
print('init', self.var)
def first(self):
var = self.var
print('first', var)
var = self.second(var)
print('fourth', var)
def second(self, par):
print('second', par)
par = random()
print('third', par)
sleep(1)
return par
你能想出一种pythonic的方式来使用属性而不是作为参数传递的局部变量吗?
编辑: 我刚刚找到了一个新的方法来解决这个问题:使用“nonlocal”语句和嵌套函数,你怎么看?
class main():
def __init__(self):
self.var = random()
print('init', self.var)
def first(self):
var = self.var
print('first', var)
def second():
nonlocal var
print('second', var)
var = random()
print('third', var)
sleep(1)
second()
print('fourth', var)
【问题讨论】:
标签: python multithreading oop attributes concurrent.futures