• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Python高效编程

python 搞java代码 3年前 (2022-06-26) 37次浏览 已收录 0个评论

“Life is short, I use python”这句喜闻乐见的宣传语,在某种程度上表白了应用python开发软件的高效。以笔者目前的能力来说,python开发软件的高效次要体现在两个方面:1. 简略且贴合自然语言的语法设计,这使得python程序的可读性极佳,可能缩小将逻辑转换为程序,查看逻辑谬误的老本。2. (简直)一切都是对象的形象形式,凭此,软件开发者首先能够将物理世界的客观事物都形象为程序中的对象,而后自在组织及操作。本文将从python程序的执行和python程序中所有皆为对象两个话题,具体论述笔者对python高效编程的浅见。

因自己满腹经纶,故行文之间恐有纰漏,望诸君海涵,不吝赐教,若能予以斧正,则感激不尽。

python程序的执行


图1 first.py

有一个first.py文件, 内容如图1所示。python解释器执行后,顺次输入the first file和the main function。由此可知,python解释器是“逐行解释”程序的。


图2 second.py

在first.py的同级目录下增加一个second.py文件, 内容如图2所示,first.py的内容更新为图3所示。python解释器执行first.py后,顺次输入the second file,the first file和the main function。这阐明,import语句被最先执行,而且second.py不是主module。此外,同级目录下多了一个__pycache__目录,其内有一个second.cpython-38.pyc文件(笔者应用的是CPython3.8解释器),它是一个binary文件,执行python second.cpython-38.pyc后,打印the second file。由此可知,python解释器是先编译second.py,而后将pyc文件给first.py应用。因而python解释器运行python程序的过程,蕴含了编译与解释两个阶段。


图3 更新后的first.py

从上述内容可知,import的语义是导入pyc文件。那么,python解释器抛出ModuleNotFoundError的本质是,__pycache__的父目录没有被退出到python解释器的搜寻门路中。个别地,python解释器的搜寻门路包含python解释器执行的当前目录,规范库及pip装置目录,环境变量PYTHONPATH以及sys.path.insert/append动静增加的目录。
进一步地,python解释器是如何执行”import second“这条语句的呢?python官网文档在importlib中给出了答案[1]。首先调用__init__.py文件中的import_module函数,而后调用_bootstrap.py文件中的_gcd_import函数,最初调用同文件下的_find_and_load函数,其源码如下图4所示。通过源码可知,python将程序运行所需的所有模块都保留在了sys.modules中,它是一个字典。


图4 _find_and_load函数源码

python程序中所有皆为对象

批改first.py文件的内容如图5所示,python解释器执行first.py后,输入内容如正文所示,这里,咱们先断言它们都是类的实例化对象。如何验证呢?


图5 first.py

python提供了__class__属性来获取对象的类。批改first.py文件内容如图6所示, 拜访它们的__class__后,输入的类如正文所示,由此验证了它们都是对象。而且,输入的这些类与MyClass一样,它们仍是类的实例化对象,能够持续拜访__class__属性,输入的类均为<class ‘type’>。此时,咱们发现module,function和int的类都是type,而且type的类仍是type。由此可知,python的对象体系如图7所示,其中type被称作metaclass。


图6 first.py的类

联合python解释器逐行解释的工作原理可知,def myFunc通过编译、解释后会被创立为名为myFunc的function对象,class MyClass通过编译、解释后会被创立为名为MyClass的class对象。查阅python官网文档可知,类function实例化的function对象myFunc只容许被调用以及作为参数传递,MyClass则能够实例化object[2]。而且,Class MyClass等同于MyClass = type(‘MyClass’, (), {}),其中type(className, bases, dict, **kwds)为type的一种构造函数[3]。


图7 python的对象体系

了解了python在宏观层面的对象体系后,咱们将眼光聚焦到对象自身。在python中,object是数据和办法的聚合体, 其中数据与办法的可调用对象, 统称为object的属性(attribute),内置函数dir(object)能够查看object的属性,object调用拜访符”.”能够拜访它的属性。
例如, 在first.py的同级目录下增加一个third.py文件, 内容如图8所示。python解释器执行third.py后,third.py中的输入内容如图8中正文所示。由此可知,module对象second,class对象MyClass及function对象myFunc,都是module对象first的属性。在third.py中应用first.XXX即可拜访它们。通过属性__module__,对象能够取得它隶属的module的名称。


图8 third.py

除了符号”.”以外,python还提供了内置函数getattr(object, name),可能通过字符串映射到object的属性。与之绝对地,内置函数setattr(object, name, value)则用于更新属性的值,这就是python的反射机制。因为python程序中简直所有皆为对象,所以熟练掌握这些内置函数后,软件开发者可能轻松实现基于字符串的事件驱动。

至此,咱们梳理一下上述内容:
1. 解释器逐行解释python程序。
2. python文件被import后,会被python解释器转换成module对象。
3. 所有module对象被演绎在sys.modules字典内,key是moudle对象的名称。
4. python文件内的class对象,function对象,根本数值对象,module对象,都是该python文件被转换后的module对象的属性。
5. __class__属性能够获取对象的class对象,__module__属性能够获取对象隶属模块的名称。
6. 内置函数getattr和setattr实现了以字符串映射到object的属性。

实践上,基于以上6点内容,咱们能够从任意python对象登程,获取到python程序中的其余已被解释器实例化的任意对象。比方,从任意python对象推得其隶属的module对象,而后获取属性module,最初拜访属性module内的对象。或者借助sys.modules,绕过import语句,间接拜访其余module内的python对象。

python解释器的解释程序和python程序中所有皆为对象的形象形式,赋予了软件开发者自在编排、更改python程序行为的能力。在此基础上,软件开发者再联合设计模式,开发教训以及大量练习,就能够实现高效、简洁、表达能力强的python程序。

参考文献
[1] https://docs.python.org/3/lib&#8230;
[2] https://docs.python.org/3/lib&#8230;
[3] https://docs.python.org/3/lib&#8230;


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Python高效编程

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址