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

Ale*_*hko 2 python metaclass python-datamodel

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

Squish的Python特定扩展模块通过内部执行以下语句的等效内容自动加载:

Python
import test
import testData
import object
import objectMap
import squishinfo
from squish import *
Run Code Online (Sandbox Code Playgroud)

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

通过这样做,他们object自动重新定义(对此),所以我尝试做新式类(如class NewClass(object):)会给我一个错误:

TypeError:调用元类库时出错.module.__init__() 最多需要2个参数(给出3个)

所以我想要object退缩.在阅读了关于元类的惊人文章之后,我正试图object使用以下代码:

class OrigObject:
    __metaclass__ = type

class NewClass(OrigObject):
    pass
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Gar*_*tty 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__()
[]
Run Code Online (Sandbox Code Playgroud)

虽然,我会注意到,我认为这对于所述模块的创建者来说是一个非常糟糕的决定,他们应该称之为其他东西.即使它针对的是Python 3.x,如果它们将它分发为2.x,它们应该考虑一下,它会把它称为别的东西并没有坏处,并且通过调用object它们会产生问题.

  • 完全同意.那种设计是灾难性的! (3认同)