Python - 为什么str()和type()在同一个SQLAlchemy基类上返回不同的数据类型?

时间:2015-02-03 06:43:09

标签: python sqlalchemy

我正在尝试一些 SQLAlchemy 示例代码。我很好奇为什么以下str()type()调用会在同一个对象上返回不同的类类型。

>>> from sqlalchemy.ext.declarative import declarative_base
>>> b = declarative_base()
>>> str(b)
"<class 'sqlalchemy.ext.declarative.api.Base'>"
>>> type(b)
<class 'sqlalchemy.ext.declarative.api.DeclarativeMeta'>

我检查了源代码,我能找到的唯一类定义是DeclarativeMeta

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

str返回对象的字符串表示形式。 type返回对象的类型,它与对象本身不同。没有理由认为这些是相同的,而且通常不是:

>>> str({})
'{}'
>>> type({})
<type 'dict'>
>>> class Foo(object):
...     pass
>>> str(Foo)
"<class '__main__.Foo'>"
>>> type(Foo)
<type 'type'>

您的情况类似于上面的第二个示例(使用类Foo)。调用declarative_base会返回一个类。那个类有元类DeclarativeMeta。在类上调用str会给出类本身的名称,默认情况下为&#34; Base&#34;。在其上调用type会返回其类型。类的类型是其元类,因此返回DeclarativeBase