我正在尝试一些 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
。
有人可以解释为什么会这样吗?
答案 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
。