【问题标题】:Python: Original 'object' class is redefined. How to get the 'object' class back?Python:重新定义了原始的“对象”类。如何找回“对象”类?
【发布时间】:2012-05-04 03:35:26
【问题描述】:

我正在为 Squish 自动化工具使用 Python 语言。这个工具用一些自定义对象和函数扩展了 python。这就是他们在manual 中所说的:

Squish 的 Python 特定扩展模块由 在内部执行等效于以下语句:

Python
import test
import testData
import object
import objectMap
import squishinfo
from squish import *

这意味着没有必要自己导入它们,除非你 正在开发自己的独立模块。

这样做他们会自动重新定义object(到this),所以我尝试做New-Style Classes(比如class NewClass(object):)给我一个错误:

TypeError:调用元类库时出错。 module.__init__() 最多接受 2 个参数(给定 3 个)

所以我正在尝试找回object。 阅读the amazing article about metaclasses 后,我尝试使用以下代码获取object

class OrigObject:
    __metaclass__ = type

class NewClass(OrigObject):
    pass

我的问题是:这与从原始object 类继承相同吗?

更新:我只能使用 Python 2.4(如果重要的话)

谢谢!

【问题讨论】:

    标签: python metaclass python-datamodel


    【解决方案1】:

    从您链接的页面:

    Squish 的对象模块与所有 Python 2 新型类和所有 Python 3 类的基类同名。在实践中,这很少是一个问题。 对于 Python 2,我们可以只创建旧式类或使用 import __builtin__ 并从 __builtin__.object 继承而不是对象。对于 Python 3,不需要做任何事情,因为我们从不显式继承对象,因为如果没有指定其他类,默认情况下它会被继承。

    所以:

    >>> import __builtin__
    >>> __builtin__.object
    <type 'object'>
    >>> class SomeOldStyleClass():
    ...    pass
    ... 
    >>> SomeOldStyleClass.__subclasses__()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: class SomeOldStyleClass has no attribute '__subclasses__'
    >>> class SomeClass(__builtin__.object):
    ...    pass
    ... 
    >>> SomeClass.__subclasses__()
    []
    

    虽然,我要指出,我认为对于所述模块的创建者而言,这是一个非常糟糕的决定,他们应该将其称为其他名称。即使它是针对 Python 3.x 的,如果他们为 2.x 分发它,他们应该考虑一下,将其称为其他名称对他们没有害处,并通过将其称为 object 他们创建问题。

    【讨论】:

    • 完全同意。这种设计是灾难性的!
    • 至于设计,我也完全同意。他们还用一个函数重新定义了type,所以class NewClass(type): 也是不可能的。无论如何,感谢您花时间查看手册并指出我错过的内容。
    【解决方案2】:

    这将为您提供:basestring.__bases__[0]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-08
      • 2015-12-29
      • 2019-12-02
      • 2014-10-31
      • 1970-01-01
      • 2022-12-19
      • 2016-03-30
      • 2021-04-04
      相关资源
      最近更新 更多