根据this tutorial(参见“使用简单元类”一节),两个声明之间存在差异:
>>> MyClass = type('MyClass', (), {})
>>> MyClass
<class '__main__.MyClass'>
和
>>> class Meta(type):
... pass
关于差异,这就是教程所说的:
类声明不仅仅是语法糖,还会做一些额外的事情,例如设置足够的__qualname__
和__doc__
属性或调用__prepare__
。
本教程是为python 3编写的,但是说脚注将在python 2不同的实例中给出。本段中没有脚注
我找不到其他说同样内容的教程。事实上,我可以找到其他人saying that they are the same。根据“类型的黑暗面”一节,它说明了两个声明:
我们可以通过以下方式达到完全相同的效果:
我的问题的原因是我偶然发现了似乎存在差异的情况。类声明有效:
class Customers(Base):
__table__ = ERPTables.Customers
虽然类型声明不起作用:
type('Customers', (Base, ), {'__table__': ERPTables.Customers})
我在这里一直保存最好的,但是当我说工作时,我的意思是在sqlAlchemy的上下文中。当在下面的代码中使用时,类声明会产生结果
query = session.query(BasisOfAutoPayment_DK)
pd.read_sql(query.limit(5).statement, session.bind)
虽然在完全相同的代码中使用时类型声明不起作用。
这是sqlAlchemy当然有很多事情要发生,但两个实例中都使用了相同的对象。相同的Base对象,相同的Table声明,相同的引擎。我认为差异在于那一方,但我试图控制它,我知道事实并非如此。这就是为什么我现在询问这两个声明。
编辑: 进一步考虑这两个声明,我可以看到一些相似之处和行为上的差异。
相似性:
做完类声明后。调用类名称将产生:
>>> Customers
__main__.Customers
这与执行类型声明时得到的响应完全相同:
>>> type('Customers', (Base, ), {'__table__': ERPTables.Customers})
__main__.Customers
然而,两者之间的一个巨大差异是:
在课程声明之后,您可以调用Customers
名称并获取刚刚显示的__main__.Customers
输出。
然而,在类型声明之后,调用Customers
名称会得到名称错误:
NameError: name 'Customers' is not defined
显然,为什么这两个在sqlAlchemy查询中的行为不同。难怪它在类型版本中不起作用,如果无法找到该对象
答案 0 :(得分:-1)
这是一个很棒的工具。 是的,一个真正伟大的工具,因为使用&#34;类型&#34;你可以传递任何参数,它会为你创建该对象.. 假设您可以使用consol输入传递此参数或使用某种网络在远程计算机上调用此函数。
但是&#34; class&#34;你必须硬编码可能使我们的程序不那么动态的类类型。
因此,它是构建动态和高级应用程序的绝佳工具。