如何将继承的 class 函数赋予线程?

How could I give a inherited class function to a thread?

import threading
class A:
    def func(self):
        print('asdf')

class B(A):
    def func(self):
        print('1234')

class C(A):
    def func(self):
        print('xyzw')
def f(inner_func):
    class_list = [A(),B(),C()]
    thread_list = []
    for i in class_list:
        x=threading.Thread(target=inner_func(i,),args=())
        thread_list.append(x)
        x.start()
    for i in thread_list:
        i.join()
f(A.func)

我以为这会打印出来

asdf
1234
xyzw

但它只是打印

asdf
asdf
asdf

如何在不手动执行的情况下立即使用继承的 classes 的功能? 我想给 inner_func 一个参数,这样我就可以将它用于不同的功能。 例如,如果 class A、B、C 有另一个函数 func2,我可以将它用作 f(A.func2) 或类似的东西。

在您的代码中,每个线程正在执行 A.func,其中 self 设置为 ABC 的实例。在任何情况下它都不会访问 B.funcC.func。根据上下文,Python 中没有可能引用 A.funcB.funcC.func 的对象。

您需要做的是传递您希望执行的函数的 名称,然后从所需的实例或 class 中检索适当的函数。所以,最后一次调用需要是 f("func");函数 f 需要适当更改。具体来说,您可以使用 getattr(A, 'func') 获取未绑定的方法(然后您可以将其调用为 method(A())),或者您可以使用 getattr(A(), 'func') 获取绑定的方法(您可以将其调用为 method()).

(另外,题外话,但是对线程和实例都使用 i 非常令人困惑,命名实例列表 class_list 也是如此。)

def f(method_name):
    instance_list = [A(), B(), C()]
    thread_list = []
    for instance in instance_list:
        thread = threading.Thread(target=getattr(instance, method_name), args=())
        thread_list.append(thread)
        thread.start()
    for thread in thread_list:
        thread.join()

f('func')