Python:重新定义了原始的“对象”类。如何找回“对象”类?
Posted
技术标签:
【中文标题】Python:重新定义了原始的“对象”类。如何找回“对象”类?【英文标题】:Python: Original 'object' class is redefined. How to get the 'object' class back? 【发布时间】: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(如果重要的话)
谢谢!
【问题讨论】:
【参考方案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]
。
【讨论】:
以上是关于Python:重新定义了原始的“对象”类。如何找回“对象”类?的主要内容,如果未能解决你的问题,请参考以下文章