2013-09-22 29 views
7

我想弄清楚我会使用object()内置函数。它不接受任何参数,并返回所有Python类共有的类型的“无特征对象”,并且具有所有Python类通用的所有方法。什么时候内置对象()是有用的?

引述杰克Skellington,WHAT. IS. THIS?

+0

它并不打算用作功能;它旨在用于基类。 – refi64

+0

在python 3中?为什么?我会从中得到什么?类会自动继承这些方法,否? – Aerovistae

+3

我发现它在你提供的文档链接中很搞笑,它有一些递归指向自身的超链接文本。 – Shashank

回答

11

即使你不需要用它来编程,object服务的目的:它是所有其他对象派生的通用类。它是由mromethod resolution order)方法列出的最后一个类。我们需要这个概念的名称和对象,并且object服务于此目的。

object的另一种用途是创建sentinels

sentinel = object() 

这通常用于多线程编程 - 通过队列 - 传递到signal a termination event。我们可能不想发送None或任何其他值,因为队列处理程序可能需要将这些值解释为要处理的参数。我们需要一些独特的价值,而不是其他程序可能产生的价值。

以这种方式创建标记提供了一个确定不是正常队列值的唯一对象,因此可以作为某种特殊事件的信号进行测试和使用。还有其他的可能性,比如创建一个类,或者类实例,或者一个函数,但是所有这些选择都更大,更重要,并且不像object()那样简洁。

4

这是最有用的,如果你重写的点(特别是__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() 
+1

欢迎来到Stack Exchange!这里是你的[嘉年华活动指南](http://stackexchange.com/sites) – Aerovistae

+0

我通常会避免直接调用'object'方法,而不是使用'super()'。一个原因是它允许协作多重继承。当然,'object'类仍然会涉及到,因为它是super()调用最终会到达的最终基类,但是您不需要明确指定它。 – Blckknght

+0

@Blckknght我一般同意你的观点,但是,在破坏递归的情况下,我通常也试图打破由超类造成的递归(不适用于框架的乐趣?)。这是我(通常)明确使用object的一个用例。 – Tritium21

相关问题