如何对 threading.Event 进行子类化?

3
在Python 2.7.5中:
from threading import Event

class State(Event):
    def __init__(self, name):
        super(Event, self).__init__()
        self.name = name

    def __repr__(self):
        return self.name + ' / ' + self.is_set()

我得到了以下错误信息:

TypeError: 调用元类基类时出错
函数()的参数1必须是代码,而不是字符串

为什么会出现这个错误?
我对 threading.Event 的所有了解都来自于 http://docs.python.org/2/library/threading.html?highlight=threading#event-objects
当它说 threading.Event() 是用于创建 threading.Event 类的工厂函数时,这意味着什么?(嗯……在我看来,它只是普通的实例化)。

我刚刚发现了https://dev59.com/WnVD5IYBdhLWcg3wE3Ro,并且正在阅读它。 - Scruffy
2个回答

5

threading.Event不是一个类,而是在threading.py中的一个函数。

def Event(*args, **kwargs):
    """A factory function that returns a new event.

    Events manage a flag that can be set to true with the set() method and reset
    to false with the clear() method. The wait() method blocks until the flag is
    true.

    """
    return _Event(*args, **kwargs)

由于此函数返回_Event实例,因此您可以对其进行子类化(尽管导入和使用带下划线的名称从未是一个好主意):

from threading import _Event

class State(_Event):
    def __init__(self, name):
        super(Event, self).__init__()
        self.name = name

    def __repr__(self):
        return self.name + ' / ' + self.is_set()

2
http://docs.python.org/2/library/threading.html?h 说 "class threading.Event"。有点误导人。我想我得开始习惯打开实际的Python源代码文件了。过去我觉得这很吓人,但现在我可能已经掌握足够的Python知识了,所以这会很有帮助。 - Scruffy

0
根据 docs.python.org 自版本 3.3 起进行了更改:Event 从工厂函数变为了类,因此您可以继承 Event 并创建自己的 Event 实例。

1
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,如引用或文档,以便他人可以确认你的答案是否正确。你可以在帮助中心上找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接