Python 如何抽象这个具体线程类的调用方式?
我正在创建从Python 如何抽象这个具体线程类的调用方式?,python,multithreading,concurrency,abstraction,Python,Multithreading,Concurrency,Abstraction,我正在创建从Thread类派生的具体类,所以实际上它们是线程。在我的示例中,类A和B 我的类Foo获取一个settingsdict,并获取帐户的列表(也包括dict项)。然后,我为每个帐户创建一个线程a,该线程包含两个参数,即整个设置dict和对应于每个帐户的帐户列表索引 但是这个例子不能使用classB。因为对线程类A的调用是硬编码的。我如何提取Foo类以按需(动态)使用classA或B?好像它们是可插拔的动作 一般来说,我对线程和python非常陌生。我愿意接受任何其他方式来证明同样的行为。
Thread
类派生的具体类,所以实际上它们是线程。在我的示例中,类A
和B
我的类Foo
获取一个settings
dict,并获取帐户的列表(也包括dict项)。然后,我为每个帐户创建一个线程a
,该线程包含两个参数,即整个设置dict和对应于每个帐户的帐户列表索引
但是这个例子不能使用classB
。因为对线程类A
的调用是硬编码的。我如何提取Foo
类以按需(动态)使用classA
或B
?好像它们是可插拔的动作
一般来说,我对线程和python非常陌生。我愿意接受任何其他方式来证明同样的行为。或者如果有更好的办法,请告诉我
class Foo(object):
def __init__(self, settings):
self.settings = settings
self.accounts = [
{
'username': 'DummyUser',
'password': 'FIXME',
},
#...
]
def start_threads(self):
threads = []
for i in range(len(self.accounts)):
post_thread = A(self.settings, self.accounts[i])
post_thread.setName(self.accounts[i]['username'])
threads.append(post_thread)
for t in threads:
t.start() # Start running the threads!
t.join() # Wait for the threads to finish...
class A(Thread):
def __init__(self, settings, account):
Thread.__init__(self)
self.settings = settings
self.account = account
def run(self):
# Stuff...
print('%s sleeping for %d seconds...' % (self.getName(), 60))
time.sleep(60)
class B(Thread):
def __init__(self, settings, account):
Thread.__init__(self)
self.settings = settings
self.account = account
def run(self):
# Stuff...
print('%s sleeping for %d seconds...' % (self.getName(), 60))
time.sleep(60)
if __name__ == '__main__':
settings = {
'setting1': 'value1',
'setting2': 'value2',
#...
}
Foo(settings).start_threads()
我真的不知道你想要什么,这就是你想要的吗
thread_class = {'A': A, 'B': B}
post_thread = thread_class['B'](self.settings, self.accounts[i])
但是这也可以被称为“硬编码”…但是我们不知道在什么情况下你想要使用类
B
。我只需要抽象对A
的调用,以便能够调用A
或B
或N
线程类(它们在概念上是相同的)。可能在Foo(设置)
中传递要作为参数调用的类名。但是我想知道在使用线程时是否有更合适的方法来实现这一点。非常好!很有魅力,谢谢!!这是python duck类型的一部分?我的意思是,使用包含“self.pluggable_action”的值作为类名来调用类。不,这不是duck类型。如果要将此行为指定给Python的基石之一:一切都是对象。类“构造函数”也是一个对象。这就是为什么在Python中它被称为“类对象”(它不是类的实例,它本身就是类定义!)。它可以作为常规参数传递给函数。它可以被调用,当被调用时,它会创建一个类的新实例。如果在函数/方法之间传递后,仍然可以调用它。--函数也是对象,可以像这里的obj类一样传递。这是一个很棒的特性,我很喜欢。事实上,它是。但它不是面向对象的。公认的答案是。
thread_class = {'A': A, 'B': B}
post_thread = thread_class['B'](self.settings, self.accounts[i])