首页 > 编程语言 >Python小白学习教程从入门到入坑------第十八课 异常模块与包【下】(语法基础)

Python小白学习教程从入门到入坑------第十八课 异常模块与包【下】(语法基础)

时间:2024-10-29 18:17:00浏览次数:8  
标签:__ Python py myscript 导入 模块 到入 ------ import

一、内置全局变量__name__

在Python中,有一些内置的全局变量和特殊变量,它们是由Python解释器预定义的,可以在代码的任何地方直接使用。

这些变量通常用于提供关于当前解释器状态的信息,或者用于控制解释器的行为

在Python中,__name__是一个内置的特殊变量,也被称为“魔法变量”或“双下划线变量”

它并不是传统意义上的“全局变量”,因为它不是由用户定义的,而是由Python解释器自动为每个模块和脚本设置的

然而,由于其作用范围是整个模块,并且可以在模块中的任何地方访问,所以有时会被非正式地称为“全局变量”(在模块范围内)

1.1 语法

if  __name__ == "__main__" : 

(用来判断当前运行的脚本是否是主程序,而不是被其他脚本导入的模块)

1.2 作用

用来控制py文件在不同的应用场景执行不同的逻辑

1.3  __name__ 使用案例

if  __name__ == "__main__" : 这行代码通常用于在脚本被直接运行时执行一些操作,而在脚本被导入为模块时不执行这些操作

这样做的好处是,你可以让你的Python文件既可以作为脚本直接运行(执行一些特定的任务,比如运行测试、作为程序的入口点等),也可以作为模块被其他脚本导入,提供函数、类和变量等

1、文件在当前程序执行(即自己执行自己):__name__ == "main"

2、文件被当作模块被其他文件导入:__name__== 模块名,下面的代码不会被显示出来

eg:

# myscript.py  
  
def my_function():  
    print("Hello from my_function in myscript!")  
  
if __name__ == "__main__":  
    # 这段代码只有在myscript.py被直接运行时才会执行  
    print("myscript.py is being run directly")  
    my_function()

如果你直接运行 myscript.py 输出将是:

myscript.py is being run directly  
Hello from my_function in myscript!

但是,如果你从另一个Python脚本中导入 myscript.py ,比如:

# another_script.py  
  
import myscript  
  
myscript.my_function()

然后运行another_script.py,输出将是:

Hello from my_function in myscript!

注意: 在 another_script.py 的执行过程中, myscript.py  中的 if __name__ == "__main__": 块没有执行,因为 myscript.py 是被导入的,而不是直接运行的

因此, myscript.py 中的print("myscript.py is being run directly") 语句没有打印出来

二、包

2.1 包的基础信息

含义:包就是项目结构中的文件夹/目录

与普通文件夹的区别:包是含有__init__.py 的文件夹

作用:包就是将有联系的模块放到同一个文件夹下,并且在这个文件夹中创建一个名字为

__init__ .py 文件,那么这个文件夹就称之为包,有效避免模块名称冲突问题,让结构更清晰。

包的本质依然是模块,包又可以包含包

2.2 包的应用 

2.2.1 新建包

在Pycharm中新建包:右键项目名 -> new -> Python Package

eg(汉化版):

2.2.2 导入包

注意:

1、import 导入包时,首先执行__init__.py 文件的代码

2、不建议在 __init__ 中编写Python模块,尽量保证__init__ 的内容简单

导包方式一:import  pack_01

在Python中,使用import语句来导入包或模块是一种基本且常见的做法。若你有一个名为pack_01的包,并希望在你的Python脚本或交互式环境中使用它,你可以按照以下方式导入:

import pack_01

这条语句会告知Python解释器去搜索名为pack_01的包,并将其内容加载到当前的命名空间中。但请注意,这里所说的是“内容”,实际上是指pack_01包下的__init__.py文件所定义的内容

若__init__.py为空,或未定义任何类或函数等,那么直接导入pack_01后,你可能无法直接访问包内的其他模块或函数(除非它们在__init__.py中被显式导入)

若你希望在导入包后能够直接使用其内部的模块或函数,你可以在__init__.py文件中添加相应的导入语句,例如:

# pack_01/__init__.py  
from .module1 import function1  
from .module2 import Class2

完成上述设置后,当你执行import pack_01时,function1和Class2将被导入,你可以通过pack_01.function1()和pack_01.Class2() 的方式调用它们

导包方式二:from  pack_01  import  fuction

如果你更习惯于直接访问包内的模块或函数,而非通过包名作为前缀,你还可以使用from ... import ...的语法来导入: 

from pack_01 import module1, module2  
# 或者直接导入特定的函数或类  
from pack_01.module1 import function1

在导入module1和module2后,你可以直接通过module1.some_function() 和  module2.SomeClass() 来调用它们

而如果你导入了特定的函数或类,如function1,则可以直接使用 function1() 进行调用,无需再通过模块名作为前缀

2.3 __all__

__all__ 变量:一个列表,可以控制要引入的东西(模块、函数、类等)

在Python中,__all__ 是一个特殊的变量,它是一个字符串列表,用于定义当从包或模块中使用 from ... import * 语句时应该导入哪些名称(模块、函数、类等)

这个变量提供了一种方式来控制导入的命名空间,避免导入不必要的或可能引发冲突的名称

当你在一个包的 __init__.py 文件或单独的模块文件中定义 __all__ 时,你实际上是在告诉Python解释器:“当有人尝试使用 from mypackage import * 或 from mymodule import * 时,只应该导入这个列表中的名称。”

例如,假设你有一个包 mypackage,其结构如下:

mypackage/  
    __init__.py  
    module1.py  
    module2.py

在 mypackage/__init__.py 文件中,你可以定义 __all__ 来控制导入:

# mypackage/__init__.py  
  
__all__ = ['module1', 'some_function']  
  
from .module1 import some_function  
# 注意:这里我们没有直接导入 module2,因为它不在 __all__ 列表中

然后,在另一个脚本中,如果你尝试:

from mypackage import *

这将只会导入 module1(作为模块对象)和 some_function(从 module1 中导入的函数)

注意:由于 module2 没有在 __all__ 列表中,它不会被导入

然而,有一个重要的点需要注意:__all__ 只影响 from ... import * 形式的导入。如果你显式地指定了要导入的名称,__all__ 将不会有任何效果。例如:

# 这将导入 module2,即使它不在 __all__ 列表中  
from mypackage import module2

今天的分享就到这里了,欢迎大家一起交流讨论学习,不当之处烦请大家指出~

标签:__,Python,py,myscript,导入,模块,到入,------,import
From: https://blog.csdn.net/qq_64441210/article/details/143309089

相关文章

  • 【APP测试】ADB安装、常用命令、monkey的使用及日志分析
    前言原生和混合在市场上区分原生、混合开发原生:是区分安卓(Andriod)和IOS(C语言)。1.一个app有两套代码,两个不同的岗位去完成的。2.性能会更好、兼容性也会好3.开发成本高、时间慢混合:原生+H5。一般可以实现一套代码生成安卓版本和iOS版......
  • 100个网络知识,懂一半绝对高手
    1)什么是链接?链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。2)OSI参考模型的层次是什么?有7个OSI层:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。3)什么是骨干网?骨干网络是集中的基础设施,旨在将不同的路由和数据......
  • Meissonic:消费级 GPU 也能轻松生成高质量图像!阿里联合多所高校推出高效文生图模型
    ❤️如果你也关注大模型与AI的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的AI应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦!......
  • Follow + WeWe RSS 订阅微信公众号
    使用https://github.com/cooderl/wewe-rss方案使用本地部署,但订阅后只有http,但在Follow上不能使用,方案排除使用rsshub,抓不到使用huggingface部署wewe-rss,可以导出https,能用执行使用Railway的免费额度部署mysql数据库访问https://railway.app/new,选择MySQL找到MY......
  • 阅读笔记2
    团队合作与沟通——编程的艺术在编程的世界里,团队合作是必不可少的。《程序员修炼之道》让我深刻认识到,有效的沟通和协作是项目成功的关键。书中提到了代码审查的重要性。这不仅仅是为了找出代码中的错误,更是为了促进团队成员之间的知识共享和相互学习。我开始积极参与团队的代......
  • 90%的父母都不及格——摘抄
    在《天道》中,丁元英面对母亲说出“养儿为防老”后,说了这样一句话:妈,您养儿就是为了防老,那就别说母爱有多伟大了,您养来养去还是为了自己,那就是交换,等不等价还两说着呢,碰到我这么个不孝顺的您就算赔了。1、成为孩子的贵人什么是贵人?就是他们看到了你未来的路,全维度能力和资源碾压......
  • 如何在Linux上配置软件负载均衡(如HAProxy)
    在Linux环境中,确保应用服务的高可用性和性能是至关重要的。本文将引导你完成以下步骤:1.理解软件负载均衡的重要性;2.选择合适的负载均衡器;3.详细配置HAProxy为例;4.进行性能调优和测试;5.监控和维护。开始负载均衡配置之前,首先需要明确其作用和目标。1.理解软件负载均衡的重要性......
  • 10.29
    软件设计                 石家庄铁道大学信息学院 实验4:抽象工厂模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解抽象工厂模式的动机,掌握该模式的结构;2、能够利用抽象工厂模式解决实际问题。 [实验任务一]:人与肤色使用抽象工厂模......
  • 《代码大全2》读后感3
    《代码大全2》是一本对软件开发实践有深刻见解的书籍。读到三分之一时,我感受到几个关键点:编程的艺术性:书中强调代码不仅仅是为了让计算机运行,更是为了让人类能够理解和维护。良好的代码风格和结构能显著提高团队协作的效率。设计原则:作者详细介绍了多种设计原则,如单一职责原则、......
  • 我用Replicate训练了个纹身Flux AI LORA模型,分享下经验
    #我用Replicate训练了个纹身AI模型,分享下经验##起因最近一直在研究AI辅助设计,正好我对纹身设计特别感兴趣。经过一段时间摸索,用Replicate平台训练了一个还不错的纹身设计模型。目前已经整合到了Hottattoo.AI平台上。其实一开始我也在纠结要不要自己训练模型,毕竟网上现成的模......