声明类与类和类型之间的区别?

时间:2017-05-06 17:43:14

标签: python python-2.7 class

根据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查询中的行为不同。难怪它在类型版本中不起作用,如果无法找到该对象

1 个答案:

答案 0 :(得分:-1)

这是一个很棒的工具。 是的,一个真正伟大的工具,因为使用&#34;类型&#34;你可以传递任何参数,它会为你创建该对象.. 假设您可以使用consol输入传递此参数或使用某种网络在远程计算机上调用此函数。

但是&#34; class&#34;你必须硬编码可能使我们的程序不那么动态的类类型。

因此,它是构建动态和高级应用程序的绝佳工具。