【问题标题】:When is the object() built-in useful?内置的 object() 什么时候有用?
【发布时间】:2013-09-22 01:08:14
【问题描述】:

我试图弄清楚我将使用object() 内置函数做什么。它不接受任何参数,并返回所有 Python 类共有的类型的“无特征对象”,并具有所有 Python 类共有的所有方法。

引用 Jack Skellington,WHAT. IS. THIS?

【问题讨论】:

  • 它不打算用作函数;它旨在用作基类。
  • 在 python 3 中?为什么?我会从中得到什么?类会自动继承这些方法,不是吗?
  • 我觉得很有趣,在您提供的文档链接中,它有一些递归指向自身的超链接文本。

标签: python python-3.x built-in


【解决方案1】:

即使您不需要使用它进行编程,object 也有一个目的:它是所有其他对象的派生的公共类。它是mro (method resolution order) 方法列出的最后一个类。我们需要这个概念的名称和对象,object 就是为了这个目的。

object 的另一个用途是创建sentinels

sentinel = object()

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

以这种方式创建哨兵提供了这样一个独特的对象,它肯定不是一个正常的队列值,因此可以被测试并用作某些特殊事件的信号。还有其他可能性,例如创建一个类、类实例或函数,但所有这些替代方案都更大、更耗费资源,而且不像 object() 那样简洁。

【讨论】:

    【解决方案2】:

    如果您要覆盖点(尤其是__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!这是你的carnival event guide
    • 我通常会避免直接在object 上调用方法,而是使用super()。一个原因是它允许协作多重继承。当然,object 类仍将涉及,因为它是 super() 调用最终将到达的最终基类,但您无需显式命名它。
    • @Blckknght 我一般同意你的观点,但是,在打破递归的情况下,我通常也试图打破由超类引起的递归(不使用框架乐趣?)。这是我(通常)明确使用对象的一个​​用例。
    • @Tritium21:我不完全确定我理解。您的意思是当替代情况(在您的示例中为do_something_else)已经是对super().__setattr__ 的调用并且这就是您要跳过的内容时,您会使用object.__setattr__ 而不是super().__setattr__?如果是这样,那是有道理的,但我不会称它为递归(我认为这是一个调用自身的函数,而不是调用同名的超类方法)。如果super().__setattr__ 调用self.__setattr__,那么如果没有您的覆盖,它将无限递归,这似乎是超类中的一个错误。
    • 确实,我使用的案例(一个内部项目)do_something_else() 还包括对超类'setattr 的调用。即使不是出于习惯,我也不会调用对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2015-08-07
    • 2011-09-28
    • 2010-12-28
    相关资源
    最近更新 更多