我想弄清楚我会使用object()
内置函数。它不接受任何参数,并返回所有Python类共有的类型的“无特征对象”,并且具有所有Python类通用的所有方法。什么时候内置对象()是有用的?
引述杰克Skellington,WHAT. IS. THIS?
我想弄清楚我会使用object()
内置函数。它不接受任何参数,并返回所有Python类共有的类型的“无特征对象”,并且具有所有Python类通用的所有方法。什么时候内置对象()是有用的?
引述杰克Skellington,WHAT. IS. THIS?
即使你不需要用它来编程,object
服务的目的:它是所有其他对象派生的通用类。它是由mro
(method resolution order)方法列出的最后一个类。我们需要这个概念的名称和对象,并且object
服务于此目的。
object
的另一种用途是创建sentinels。
sentinel = object()
这通常用于多线程编程 - 通过队列 - 传递到signal a termination event。我们可能不想发送None
或任何其他值,因为队列处理程序可能需要将这些值解释为要处理的参数。我们需要一些独特的价值,而不是其他程序可能产生的价值。
以这种方式创建标记提供了一个确定不是正常队列值的唯一对象,因此可以作为某种特殊事件的信号进行测试和使用。还有其他的可能性,比如创建一个类,或者类实例,或者一个函数,但是所有这些选择都更大,更重要,并且不像object()
那样简洁。
这是最有用的,如果你重写的点(特别是__setattr__
),它允许你打破递归。例如:
class SomeClass(object):
def __setattr__(self, name, value):
if name not in ('attr1', 'attr2', 'attr3', 'attr4'):
object.__setattr__(self, name, value)
else:
do_something_else()
欢迎来到Stack Exchange!这里是你的[嘉年华活动指南](http://stackexchange.com/sites) – Aerovistae
我通常会避免直接调用'object'方法,而不是使用'super()'。一个原因是它允许协作多重继承。当然,'object'类仍然会涉及到,因为它是super()调用最终会到达的最终基类,但是您不需要明确指定它。 – Blckknght
@Blckknght我一般同意你的观点,但是,在破坏递归的情况下,我通常也试图打破由超类造成的递归(不适用于框架的乐趣?)。这是我(通常)明确使用object的一个用例。 – Tritium21
它并不打算用作功能;它旨在用于基类。 – refi64
在python 3中?为什么?我会从中得到什么?类会自动继承这些方法,否? – Aerovistae
我发现它在你提供的文档链接中很搞笑,它有一些递归指向自身的超链接文本。 – Shashank