Python内置类属性`__name__`属性的使用教程

news2025/1/11 17:47:11

ea8efe431f266973a4a2b43f677aa207.jpeg

更多Python学习内容:ipengtao.com

Python中的__name__是一种内置的特殊属性,通常用于判断模块是作为主程序运行还是作为模块被导入。本文将深入讲解__name__属性的用法,通过丰富的示例代码展示其在不同情景下的应用。

模块作为主程序运行

当一个Python文件作为主程序运行时,__name__属性的值将被设置为__main__。这提供了一种方式,通过判断__name__来执行特定的代码块。

# main_program.py

def main():
    print("This is the main program.")

if __name__ == "__main__":
    main()

模块被导入

如果一个Python文件被其他文件导入,__name__的值将是该模块的名称,而不是__main__。这为模块提供了一种在导入时不执行某些代码的方式。

# module_example.py

def 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.py

import module_example

def test_function():
    print("Testing the functionality of the module.")

if __name__ == "__main__":
    module_example.some_function()
    test_function()

单元测试

在编写单元测试时,__name__属性可以用于判断当前模块是否为测试模块,以便执行相应的测试代码。

# test_module.py

import unittest
from module_example import some_function

class 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.py

def some_function():
    print("This function is part of the module.")

if __name__ == "__main__":
    some_function()

2. 模块集成到其他程序

当在其他程序中导入模块时,__name__属性的值将是模块的名称,而不是__main__。这使得模块能够无缝地集成到其他程序中,而不执行在if __name__ == "__main__":块内的代码。

# main_program.py

from module_example import some_function

# 此处可以包含其他代码

some_function()  # 导入的模块能够正常使用,但不会执行 if __name__ == "__main__": 块内的代码

3. 提高可维护性

通过将相关功能封装在不同的模块中,能够更清晰地组织代码,提高可维护性。每个模块都可以专注于特定的任务,使得代码更易于理解和调试。

# utilities.py

def utility_function():
    print("Utility function.")

# main_program.py

from utilities import utility_function

# 此处可以包含其他代码

utility_function()  # 使用模块中的功能,提高可维护性

4. 模块的独立测试

代码模块化还为独立测试提供了方便。每个模块都可以包含自己的测试代码,通过独立运行模块进行测试,确保其功能正常。

# test_module.py

from module_example import some_function

def test_some_function():
    result = some_function()
    assert result == "Expected Result"

if __name__ == "__main__":
    test_some_function()  # 可以独立运行测试模块

5. 模块的复用

将功能封装在模块中意味着这些功能可以在项目的不同部分中被重复使用。这种代码复用的方式提高了开发效率,同时减少了潜在的错误。

# project_a.py

from utilities import utility_function

# 此处可以包含其他代码

utility_function()  # 复用 utilities 模块的功能

# project_b.py

from utilities import utility_function

# 此处可以包含其他代码

utility_function()  # 同样复用 utilities 模块的功能

动态调试和调用

__name__属性也可以用于动态地调试和调用代码块。通过检查__name__属性,可以在不修改代码的情况下选择性地运行或跳过特定部分,这在一些特殊的调试场景中非常有用。

# debug_example.py

def debug_function():
    print("Debugging function.")

if __name__ == "__main__":
    debug_function()

通过将上述代码保存为debug_example.py,可以在其他脚本中选择性地调用debug_function,而不必执行整个模块的内容。

# main_script.py

from debug_example import debug_function

# 此处可以包含其他代码

if need_debugging:
    debug_function()

多模块项目结构

在大型项目中,通常会有多个模块相互依赖。通过__name__属性,能够在每个模块中定义独立的测试代码,使得整个项目的结构更加清晰,便于维护。

# module_a.py

def function_a():
    print("Function A.")

if __name__ == "__main__":
    function_a()
# module_b.py

from module_a import function_a

def function_b():
    print("Function B.")
    function_a()

if __name__ == "__main__":
    function_b()

类的初始化

在类的定义中,也可以使用__name__属性来判断是否是类的初始化过程。这在某些情况下可以用于执行一些特定的初始化代码。

# class_example.py

class MyClass:

    def __init__(self):
        if __name__ == "__main__":
            print("Initializing the class.")

# 此处可以包含其他代码

异常处理和模块重载

__name__属性还可以用于异常处理和模块的动态重载。通过捕捉异常并根据__name__属性决定如何处理,可以实现更灵活的异常处理策略。

# exception_handling.py

try:
    # 一些可能引发异常的代码
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下载

f344a60049a344bb740fbe955549fd44.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1264953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软著项目推荐 深度学习二维码识别

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 🔥 优质竞赛项目系列,今天…

西南科技大学数字电子技术实验二(SSI逻辑器件设计组合逻辑电路及FPGA实现 )FPGA部分

一、实验目的 1、掌握用SSI(小规模集成电路)逻辑器件设计组合电路的方法。 2、掌握组合逻辑电路的调试方法。 3、学会分析和解决实验中遇到的问题。 4、学会用FPGA实现本实验内容。 二、实验原理 包括:原理图绘制和实验原理简述 1、1位半加器 2、1位全加器 3、三…

基于SSM的高校学生实习管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

快上车~「黄钊的AI日报·第二季」预约抢跑群、锁定明晚早鸟价

本周,即将开启我的小报童专栏「黄钊的AI日报第二季」(12月1日~2月29日)。 周三(明天)晚上,会举办“抢跑群”活动,首发「早鸟票」、专栏内容及相关福利介绍,包括但不限于:…

服务器中启动和停止项目

服务器中启动和停止项目 一、前言二、使用命令启动和关闭项目1、启动项目2、停止项目 三、使用可执行脚本启动和关闭项目1、启动项目2、停止项目 一、前言 在服务器上部署项目,一般就是将项目挂在后台,如果是微服务首选docker-compose,但如果…

人工智能-优化算法之梯度下降

梯度下降 尽管梯度下降(gradient descent)很少直接用于深度学习, 但了解它是理解下一节随机梯度下降算法的关键。 例如,由于学习率过大,优化问题可能会发散,这种现象早已在梯度下降中出现。 同样地&#x…

二百零八、Hive——HiveSQL异常:Select查询数据正常,但SQL语句加上group by查询数据为空

一、目的 在HiveSQL的DWD层中,需要对原始数据进行去重在内的清洗,结果一开始其他数据类型的清洗工作都正常,直到碰到转向比数据。 一般的SQL查询有数据,但是加上group by以后就没数据; 一般的SQL查询有数据&#xf…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展

近年来,国内外学者在生态系统的敏感性、适应能力和潜在影响等方面开展了大量的生态脆弱性研究,他们普遍将生态脆弱性概念与农牧交错带、喀斯特地区、黄土高原区、流域、城市等相结合,评价不同类型研究区的生态脆弱特征,其研究内容…

SpringBoot RestTemplate 的使用

一、简介 RestTemplate 在JDK HttpURLConnection、Apache HttpComponents、OkHttp等基础上&#xff0c;封装了更高级别的API&#xff0c;默认依赖JDK HttpURLConnection&#xff0c;连接方式默认长连接。 二、使用 2.1、引入依赖 <dependency><groupId>org.spri…

STK Components 二次开发- 卫星地面站

前期卫星地面站创建已经说过&#xff0c;本次说一下卫星和地面站可见性时卫星名称和轨迹线变色问题。 1.创建卫星 // Get the current TLE for the given satellite identifier. var tleList TwoLineElementSetHelper.GetTles(m_satelliteIdentifier, JulianDate.Now);// Us…

Ubuntu:安装Powershell

Powershell的安装与使用&#xff1a; 1&#xff09;安装Powershell&#xff1a;在终端依次运行以下命令即可&#xff1a; $ sudo apt-get update $ sudo apt-get install -y wget apt-transport-https software-properties-common $ wget -q "https://packages.microsof…

Asp.net core WebApi 配置自定义swaggerUI和中文注释

1.创建asp.net core webApi项目 默认会引入swagger的Nuget包 <PackageReference Include"Swashbuckle.AspNetCore" Version"6.2.3" />2.配置基本信息和中文注释&#xff08;默认是没有中文注释的&#xff09; 2.1创建一个新的controller using Micr…

(5h)Unity3D快速入门之Roll-A-Ball游戏开发

DAY1&#xff1a;Unity3D安装 链接 DAY2&#xff1a;构建场景&#xff0c;编写代码 链接 内容&#xff1a;WASD前后左右移动、摄像机跟随 DAY3&#xff1a;待更新 DAY4&#xff1a;待更新 DAY5&#xff1a;待更新

配置和运行yolov5时报错ModuleNotFoundError: No module named ‘ultralytics.yolo‘的解决方法

yolov5的官方文件 链接&#xff1a;https://pan.baidu.com/s/1WNoTDvBGDrgTfUiHDSB6Gg?pwd8MXz 提取码&#xff1a;8MXz 在终端里面运行detect.py文件&#xff0c;报下面的错误 分析上面的错误&#xff0c;发现是在utils/general.py文件里的39行处报错了。因为找不到check_r…

0004Java程序设计-ssm基于微信小程序的校园第二课堂

文章目录 摘 要目录系统设计开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。…

Modbus平台:协议中间件(支持Modbus TCP、RTU、ASCII)

该程序可放置外网中&#xff0c;适用于DTU长连接&#xff08;心跳包必须包含DTU&#xff0c;可以是tcp/udp&#xff09;&#xff0c;也可以在内网中&#xff0c;短连接访问设备server 支持协议&#xff1a;Modbus TCP | RTU | ASCII 连接方式&#xff1a;TcpAtive: TCP主动 | …

3种在ArcGIS Pro中制作山体阴影的方法

山体阴影可以更直观的展现地貌特点&#xff0c;表达真实的地形&#xff0c;这里为大家介绍一下在ArcGIS Pro中制作山体阴影的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&#xff0c;常见的GIS数据…

SpringBoot整合MongoDB: 构建高效的数据存储应用

文章目录 1. 引言2. MongoDB简介3. 准备工作4. SpringBoot中配置MongoDB5. 创建MongoDB实体类6. 使用Spring Data MongoDB进行数据操作7. 编写Service层8. 控制器层9. 测试10. 拓展10.1. 复杂查询10.2. 数据分页10.3. 索引优化 11. 总结 &#x1f389;SpringBoot整合MongoDB: 构…

ARM Cortex-M核的内核态,用户态

首先&#xff0c;用户态和内核态是从操作系统层面上来划分的&#xff0c;如果没有操作系统&#xff0c;我可以直接运行在特权模式下&#xff0c;并使用特权指令。在这种情况下&#xff0c;我将负责管理和控制系统资源&#xff0c;执行关键操作&#xff0c;以及确保系统的安全性…

Linux僵死进程及文件操作

1.僵死进程(僵尸进程)&#xff1a; 1.僵死进程产生的原因或者条件: 什么是僵死进程? 当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程. 简而言之,就是子进程先结束,并且父进程没有获取它的退出码; 那么僵死进程产生的原因或者条件就是:子进…