python 类初始化顺序_Python模块初始化顺序?

Under C++, there is a well known problem called global/static variable initialization order fiasco, due to C++'s inability to decide which global/static variable would be initialized first across compilation units,

我认为语句突出了Python和C++之间的关键区别:在Python中,没有不同的编译单元。我的意思是,在C++中(如你所知),两个不同的源文件可以完全独立地编译,因此,如果比较文件A中的一行和文件B中的一行,则没有什么可以告诉你哪一个将被放在程序中的第一位。这有点像多线程的情况:您无法确定线程1中的特定语句将在线程2中的特定语句之前还是之后执行。你可以说C++程序是并行编译的。在

相反,在Python中,执行从一个文件的顶部开始,按照定义良好的顺序通过文件中的每个语句执行,并在其他文件导入的位置分支到其他文件。实际上,您几乎可以将import指令看作#include,这样就可以确定程序中所有源文件中所有代码行的执行顺序。(嗯,这比它复杂一点,因为一个模块在第一次导入时才真正被执行,并且由于其他原因)如果C++程序并行编译,Python程序就被串行地解释。在

您的问题还涉及到Python中模块的深层含义。Python模块是一个实际的对象,它是单个.py文件中的所有内容。在单个源文件的“global”范围内声明的所有内容实际上都是该模块对象的属性。Python中没有真正的全局作用域。(Python程序员经常说“全局”,实际上,在语言中有一个^ {CD4}}关键字,但它总是指当前模块的顶层。)我可以看到,这是一个陌生的概念,习惯于从C++背景中来。我从java中得到一些习惯,在这方面,java比python更类似于C++。(Java中也没有全局范围)

我将提到,在Python中,使用一个变量而不知道它是否已被初始化/定义是完全正常的。嗯,也许不正常,但至少在适当的情况下是可以接受的。在Python中,试图使用未定义的变量会引发^ {< CD5> };您不能像C或C++那样任意地进行行为,因此您可以轻松地处理这种情况。您可能会看到这种模式:try:

duck.quack()

except NameError:

pass

如果duck不存在,则不执行任何操作。实际上,你通常会看到

^{pr2}$

如果duck没有一个名为quack的方法,则它不会执行任何操作。(AttributeError是当你试图访问一个对象的一个属性,但是这个对象没有这个名称的任何属性)这就是在Python中进行类型检查的原因:我们认为如果我们只需要鸭子呱呱叫,我们可以要求它呱呱叫,如果它叫了,我们就不在乎它是不是真的还是鸭子不是。(这叫做鸭子打字;-)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值