如何将继承的 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
设置为 A
、B
和 C
的实例。在任何情况下它都不会访问 B.func
或 C.func
。根据上下文,Python 中没有可能引用 A.func
或 B.func
或 C.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')
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
设置为 A
、B
和 C
的实例。在任何情况下它都不会访问 B.func
或 C.func
。根据上下文,Python 中没有可能引用 A.func
或 B.func
或 C.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')