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:重新定义了原始的“对象”类。如何找回“对象”类?的主要内容,如果未能解决你的问题,请参考以下文章

python属性重新赋值叫啥

如果磁盘上的文件发生更改,如何重新加载 python 类?

人人网的密码忘了如何找回或登入?

如何在 Azure Databricks 中保存自定义 python 类对象?

python学习笔记7.更加抽象

如何在python 3中有效地将原始字节写入numpy数组数据