Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何抽象这个具体线程类的调用方式?_Python_Multithreading_Concurrency_Abstraction - Fatal编程技术网

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和对应于每个帐户的帐户列表索引

但是这个例子不能使用class
B
。因为对线程类
A
的调用是硬编码的。我如何提取
Foo
类以按需(动态)使用class
A
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])