python - 'self' 从哪里来?将成员函数作为 threading.Thread 的目标

标签 python multithreading

在下面的代码中

class foo:
    def __init__(self,x):
        self.x = x

    def do(self):
        print(self.x)

foo1 = foo(1)
foo2 = foo(2)
t1=threading.Thread(target=foo1.do)
t2=threading.Thread(target=foo2.do)
t1.start()
t2.start()

我正在使用实例化对象的成员函数作为线程的目标。我想知道它为什么起作用,即线程模块是否做了一些特殊的事情来检测在可调用引用?我认为通常的回调机制如 ftplib.retrlines() 等将只接受普通的全局函数。完全远离这一切会更好吗?

拉尔提

PS:来自 C/C++ 的公开行为对我来说是新的(尽管欢迎)。

最佳答案

您可能想阅读有关 Python 的 method objects 的内容.

Python 的 self 有点像 C++ 的 this,只不过你必须把它放在方法声明中。

当您在类中声明一个函数时,它会“变成”一个方法。当您获取一个对象的方法时,它就变成了一个绑定(bind)方法,它的第一个参数 (self) 固定为您从中获取它的对象。

尝试:

class Foo(object):
    def do(self):
        print x

instance = Foo()
print Foo.do  # prints <unbound method Foo.do>
print instance.do  # prints <bound method Foo.do of <...>>

# These are equivalent:
Foo.do(instance)
instance.do()

在您的 Threading 案例中没有发生额外的魔法,它只是普通的 Python。

关于python - 'self' 从哪里来?将成员函数作为 threading.Thread 的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7791035/

相关文章:

python - 如何根据另一列的时间将列添加到 pandas 数据框

c++ - 生成贝塞尔曲面作为子补丁

java - 从广播接收器发送数据到android中的自定义线程不起作用?

python - Scrapy:在下载器中间件中返回FormRequest

python - Pyspark 将列类型从日期更改为字符串

python - Pandas:用一定的值(value)填补时间的空白

java - 这种情况需要同步吗

python - 类型错误 : __call__() takes from 1 to 2 positional arguments but 3 were given

java - 我想通过多线程将此函数作为列表中所有值的线程执行,请指导我

c# - 不同系统配置的最佳IO线程数