Python:原始的'对象'类被重新定义。如何获得'对象'课程?

时间:2012-04-23 13:57:42

标签: python metaclass python-datamodel

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

  

Squish的Python特定扩展模块由。自动加载   在内部执行以下语句的等价物:

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

这意味着除非您自己导入,否则无需自行导入   正在开发自己的独立模块。

通过这样做,他们会自动重新定义object (到this),所以我尝试进行新式课程(如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 (如果重要的话)

谢谢!

2 个答案:

答案 0 :(得分:7)

从您关联的页面开始:

  

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没有坏处他们制造问题。

答案 1 :(得分:2)

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