Python内置类属性`__name__`属性的使用教程
更多Python学习内容:ipengtao.com
Python中的__name__
是一种内置的特殊属性,通常用于判断模块是作为主程序运行还是作为模块被导入。本文将深入讲解__name__
属性的用法,通过丰富的示例代码展示其在不同情景下的应用。
模块作为主程序运行
当一个Python文件作为主程序运行时,__name__
属性的值将被设置为__main__
。这提供了一种方式,通过判断__name__
来执行特定的代码块。
# main_program.pydef main():print("This is the main program.")if __name__ == "__main__":main()
模块被导入
如果一个Python文件被其他文件导入,__name__
的值将是该模块的名称,而不是__main__
。这为模块提供了一种在导入时不执行某些代码的方式。
# module_example.pydef some_function():print("This function is part of the module.")if __name__ == "__main__":print("This will not be executed when the module is imported.")
测试模块
__name__
属性的灵活运用可以在一个文件中编写既可以独立运行,又可以被其他程序导入的代码。这对于编写可重用的模块和测试脚本非常有用。
# test_module.pyimport module_exampledef test_function():print("Testing the functionality of the module.")if __name__ == "__main__":module_example.some_function()test_function()
单元测试
在编写单元测试时,__name__
属性可以用于判断当前模块是否为测试模块,以便执行相应的测试代码。
# test_module.pyimport unittest
from module_example import some_functionclass TestModuleExample(unittest.TestCase):def test_some_function(self):result = some_function()self.assertEqual(result, "Expected Result")if __name__ == "__main__":unittest.main()
代码模块化
在软件开发中,代码模块化是一种关键的设计原则,有助于提高代码的可读性、可维护性和可扩展性。合理使用__name__
属性是实现代码模块化的一种重要手段。以下是关于代码模块化的更进一步探讨:
1. 模块独立运行
通过在模块中使用if __name__ == "__main__":
语句,确保模块在需要时能够独立运行。这使得每个模块都成为一个可执行的脚本,方便测试和调试。
# module_example.pydef some_function():print("This function is part of the module.")if __name__ == "__main__":some_function()
2. 模块集成到其他程序
当在其他程序中导入模块时,__name__
属性的值将是模块的名称,而不是__main__
。这使得模块能够无缝地集成到其他程序中,而不执行在if __name__ == "__main__":
块内的代码。
# main_program.pyfrom module_example import some_function# 此处可以包含其他代码some_function() # 导入的模块能够正常使用,但不会执行 if __name__ == "__main__": 块内的代码
3. 提高可维护性
通过将相关功能封装在不同的模块中,能够更清晰地组织代码,提高可维护性。每个模块都可以专注于特定的任务,使得代码更易于理解和调试。
# utilities.pydef utility_function():print("Utility function.")# main_program.pyfrom utilities import utility_function# 此处可以包含其他代码utility_function() # 使用模块中的功能,提高可维护性
4. 模块的独立测试
代码模块化还为独立测试提供了方便。每个模块都可以包含自己的测试代码,通过独立运行模块进行测试,确保其功能正常。
# test_module.pyfrom module_example import some_functiondef test_some_function():result = some_function()assert result == "Expected Result"if __name__ == "__main__":test_some_function() # 可以独立运行测试模块
5. 模块的复用
将功能封装在模块中意味着这些功能可以在项目的不同部分中被重复使用。这种代码复用的方式提高了开发效率,同时减少了潜在的错误。
# project_a.pyfrom utilities import utility_function# 此处可以包含其他代码utility_function() # 复用 utilities 模块的功能# project_b.pyfrom utilities import utility_function# 此处可以包含其他代码utility_function() # 同样复用 utilities 模块的功能
动态调试和调用
__name__
属性也可以用于动态地调试和调用代码块。通过检查__name__
属性,可以在不修改代码的情况下选择性地运行或跳过特定部分,这在一些特殊的调试场景中非常有用。
# debug_example.pydef debug_function():print("Debugging function.")if __name__ == "__main__":debug_function()
通过将上述代码保存为debug_example.py
,可以在其他脚本中选择性地调用debug_function
,而不必执行整个模块的内容。
# main_script.pyfrom debug_example import debug_function# 此处可以包含其他代码if need_debugging:debug_function()
多模块项目结构
在大型项目中,通常会有多个模块相互依赖。通过__name__
属性,能够在每个模块中定义独立的测试代码,使得整个项目的结构更加清晰,便于维护。
# module_a.pydef function_a():print("Function A.")if __name__ == "__main__":function_a()
# module_b.pyfrom module_a import function_adef function_b():print("Function B.")function_a()if __name__ == "__main__":function_b()
类的初始化
在类的定义中,也可以使用__name__
属性来判断是否是类的初始化过程。这在某些情况下可以用于执行一些特定的初始化代码。
# class_example.pyclass MyClass:def __init__(self):if __name__ == "__main__":print("Initializing the class.")# 此处可以包含其他代码
异常处理和模块重载
__name__
属性还可以用于异常处理和模块的动态重载。通过捕捉异常并根据__name__
属性决定如何处理,可以实现更灵活的异常处理策略。
# exception_handling.pytry:# 一些可能引发异常的代码
except Exception as e:if __name__ == "__main__":print(f"Exception caught: {e}")else:raise e
在模块需要重载时,也可以根据__name__
属性进行不同的处理。
总结
在本文中,深入探讨了通过合理使用__name__
属性实现代码模块化的重要性和多种应用场景。通过判断__name__
属性的值,能够使模块既可以作为独立的脚本运行,又能够作为可导入的模块集成到其他程序中。这种设计风格不仅提高了代码的可维护性,还使得每个模块都能够独立测试,确保其功能的正常运行。
代码模块化的优势不仅体现在独立运行和集成到其他程序中,还表现在提高可维护性、独立测试、模块复用等多个方面。通过将相关功能封装在不同的模块中,我们能够更清晰地组织代码,降低了代码的复杂性。同时,模块的独立测试为项目的稳定性提供了保障,而模块复用则提高了开发效率,减少了重复劳动。
总的来说,通过充分发挥__name__
属性的作用,能够构建出清晰、灵活、易于维护的代码结构。这种模块化的设计风格是实现高质量软件的基础,也是提高开发团队协作效率的有效手段。在实际项目中,深刻理解并灵活应用__name__
属性,将有助于提升代码质量,为未来的项目开发奠定坚实基础。
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!
更多Python学习内容:ipengtao.com
干货笔记整理
100个爬虫常见问题.pdf ,太全了!
Python 自动化运维 100个常见问题.pdf
Python Web 开发常见的100个问题.pdf
124个Python案例,完整源代码!
PYTHON 3.10中文版官方文档
耗时三个月整理的《Python之路2.0.pdf》开放下载
最经典的编程教材《Think Python》开源中文版.PDF下载
相关文章:

Python内置类属性`__name__`属性的使用教程
更多Python学习内容:ipengtao.com Python中的__name__是一种内置的特殊属性,通常用于判断模块是作为主程序运行还是作为模块被导入。本文将深入讲解__name__属性的用法,通过丰富的示例代码展示其在不同情景下的应用。 模块作为主程序运行 当一…...

BUUCTF-pwn-ciscn_2019_ne_51
简单查看保护: 32为程序没有canary没有PIE,应该是简单的栈溢出。我们照着这个思路去找溢出点在哪,运行下程序看看什么情况: 程序上来是输入一个密码验证。随便输入下错误直接退出。因此我们需要到IDA中看看怎么回事: 主…...
【限时免费】20天拿下华为OD笔试之【哈希表】2023Q2B-选修课【欧弟算法】全网注释最详细分类最全的华为OD真题题解
文章目录 题目描述与示例题目描述输入输出示例一输入输出说明 示例二输入输出说明 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 现有两门选修课,每门选修课都有一部分学生选修,每个学生都有…...

Android关于杀掉进程的方案
《风波莫听穿林打叶声》—— 苏轼 〔宋代〕 三月七日,沙湖道中遇雨,雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此词。 莫听穿林打叶声,何妨吟啸且徐行。 竹杖芒鞋轻胜马,谁怕?一蓑…...
mysql数据库基本概念简介
概述 为什么要使用数据库? 答:实现数据的持久化。 数据库存储类型多样,存储量大。由于其他文件等介质。 概念 DB:database(数据库),保存数据的仓库,本质是一个文件系统。 DBMS:数据库管理系统,常说的Mysql数…...

前端开发_HTML
简介 CSS用于美化内容 HTML用于摆放内容 可以理解为HTML是基础,CSS是工具 HTML定义 HTML 超文本标记语言——HyperText Markup Language 超文本——链接 标记——标签,即带尖括号的文本 标签语法 双标签 开始标签: <xxx> 即尖…...

1.Spring源码解析-ClassPathXmlApplicationContext
此类是读取spring的xml配置文件并解析。也是源码入口之一。 我们调试即将开始。 传递给父类设置值 经调试我们得到是给AbstractApplicationContext设置默认的应用上下文父级的值,很明显是空 给父类AbstractRefreshableConfigApplicationContext设置属性 刷新容器…...
android 动态创建selector状态选择器 动态创建Drawable
最近在做一个使用接口返回的字符串:"#ff0000" 来动态设置drawable背景颜色与动态设置状态选择器selector的需求,之前写习惯了shape的xml,还是第一次写动态的,有点搞笑,搞笑的是自己没写过,不知道…...
Python与设计模式--责任链模式
23种计模式之 前言 (5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、(11)策略模式、责任链模式、命令模式、中介者模…...
(C)一些题6
1.正确定义符号常量PI的宏定义为 A.define PI 3.14 B.define PI 3.14: C。#define PI 3.14 D #define PI 3.14; 2。关于字符数组的描述中错误的是() A.字符数组可以存放字符串 B.字符数组中的字符串可以整体输入和输出 C。可以在赋值语句中通过运算符“”对…...

基于单片机的肺活量检测系统(论文+源码)
1.系统设计 在基于单片机的肺活量检测系统中,在硬件上整个系统通过利用主控制器STC89C52单片机来实现对整个系统进行控制的功能,通过采用LCD1602实现实时液晶显示数据的功能,通过肺活量传感器XGZP6847ADC0832实现监测肺活量的工作࿰…...

【开题报告】海洋多源数据质量控制应用服务的WebServer设计与实现
开 题 报 告 内 容 论文选题的意义、主要研究内容和文献资料调研情况 一、选题意义 在当今世界研究自然环境的大背景下,计算机技术与各学科、各领域的综合应用逐渐增多。作为地球上最广阔的水体,同时也是地球上决定气候发展的主要的因素之一࿰…...

接单平台在精不在多,劝诸位程序员找个好平台!
程序员想找兼职搞副业,结果知乎上逛了一大圈,各种平台推荐,可以说是眼花缭乱。要么就是平台一搜,各种劝退!好好好,就问一句,还搞不搞?Of course~有钱还不赚的是傻子。加班摸鱼的时候…...

mybatis关于namespace以及id以及Mapper接口命名的说明(了解)
1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…...
MySQL中的锁(简单)
目录 1. 共享锁(Shared Lock): 2. 排他锁(Exclusive Lock): 3. 行级锁(Row-Level Lock): 4. 页级锁(Page-Level Lock): 5. 表级锁…...
【独家OD2023C卷真题】20天拿下华为OD笔试【贪心】2023C-分配土地最大面积【欧弟算法】全网注释最详细分类最全的华为OD真题题解
文章目录 题目描述与示例题目描述输入描述输出描述备注示例一输入输出说明 示例二输入输出说明 解题思路单种颜色的最小覆盖面积多种颜色的最小覆盖面积 代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 从前有个村庄…...
省市区编码sql
CREATE TABLE area (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,code varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 编码,name varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 名称,parent_code varchar(64) COLLATE utf8mb4_bin DEFAULT NULL CO…...

实现电商平台与营销系统无缝集成:雅座的无代码开发与API连接
无代码开发:营销的新引擎 在数字化转型的浪潮中,无代码开发已成为企业提升效率、减少成本的新引擎。这种开发方式允许非技术人员通过图形界面构建应用程序,无需编写代码即可实现复杂功能。这对于营销、广告推广以及用户运营等业务尤为重要&a…...

win10下安装 Anaconda + Cuda + Cudnn + Pycharm + Pytorch
1.安装Anaconda (1-1)下载Ananconda, Anaconda官网 选择windows版本; (1-2)安装Anaconda,一般选择【Just Me】 (1-3)建议不要装在C盘,后期多环境的python环境和各种库文件会占用很多…...

第20章 多线程
创建线程 继承Thread 类 Thread 类时 java.lang 包中的一个类,从类中实例化的对象代表线程,程序员启动一个新线程需要建立 Thread 实例。 Thread 对象需要一个任务来执行,任务是指线程在启动时执行的工作,start() 方法启动线程&am…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...