在Python中,以双下划线 __ 开头的函数(或变量)具有特殊的命名含义,主要用于实现类的私有成员、魔法方法(特殊方法)和名称修饰(Name Mangling)机制。下面详细解释这三种情况:

1. 魔法方法(特殊方法)

以双下划线开头并结尾的方法(如 __init____str__)称为魔法方法(Magic Methods)或特殊方法(Special Methods)。这些方法由Python解释器自动调用,用于实现类的内置行为。

常见魔法方法示例
class MyClass:def __init__(self, value):  # 构造函数,创建对象时自动调用self.value = valuedef __str__(self):  # 对象转字符串时调用(如print())return f"MyClass(value={self.value})"def __add__(self, other):  # 定义加法操作(如obj1 + obj2)return MyClass(self.value + other.value)def __len__(self):  # 定义长度(如len(obj))return 1
调用示例
a = MyClass(10)
b = MyClass(20)
print(a + b)      # 自动调用 __add__ 和 __str__
print(len(a))     # 自动调用 __len__

2. 私有方法和属性(名称修饰)

以双下划线开头但不以双下划线结尾的方法(如 __private_method)是类的私有成员,通过名称修饰(Name Mangling)机制实现一定程度的访问限制。

名称修饰规则

Python会将类中的 __private_method 重命名为 _类名__private_method,使得该方法在类外部难以直接访问,但并非完全禁止。

示例代码
class MyClass:def __public_method(self):print("这是公开方法")def __private_method(self):print("这是私有方法")def call_private(self):self.__private_method()  # 类内部可以正常调用obj = MyClass()
obj.__public_method()     # 正常调用
# obj.__private_method()  # 报错:AttributeError
obj._MyClass__private_method()  # 可以访问,但不推荐(违反封装原则)

3. 与单下划线 _ 的区别

  • 单下划线 _method:约定俗成的弱私有成员,仅作为开发者之间的约定,外部仍可访问。
  • 双下划线 __method:通过名称修饰实现的强私有成员,外部访问需通过 _类名__method
示例对比
class MyClass:def _single_underscore(self):print("单下划线方法")def __double_underscore(self):print("双下划线方法")obj = MyClass()
obj._single_underscore()     # 可以正常调用(约定不调用)
obj._MyClass__double_underscore()  # 可以调用(但破坏封装)

4. 使用场景建议

  • 魔法方法:用于实现类的特殊行为,如运算符重载、对象创建和销毁等。
  • 私有方法:用于隐藏类的内部实现细节,避免外部直接调用(但需注意并非绝对安全)。
  • 单下划线:用于模块级的私有成员(导入时 from module import * 不会导入)或内部临时变量。

总结

命名方式含义示例
__method__魔法方法,Python内置行为__init__, __add__
__method私有方法,通过名称修饰实现封装__private_method
_method弱私有,约定不被外部直接访问_helper_method

双下划线命名是Python实现封装和特殊行为的重要机制,合理使用可以提高代码的可读性和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代理模式 - Flutter中的智能替身,掌控对象访问的每一道关卡!

痛点场景:直接加载高清大图 假设你的应用需要显示用户相册: NetworkImage(https://example.com/high-res-photo.jpg)面临的问题: 📶 网络差时长时间白屏💾 重复下载相同图片浪费流量🔒 敏感图片无权限验…

Python集合的创建

一、前言 在 Python 编程中,集合(set)是一种非常实用的数据结构,它能够存储一组无序且不重复的元素。集合广泛应用于数据去重、交并差运算等场景。 本文将重点讲解 Python 中集合的创建方式,包括使用大括号 {}、set(…

作物生长模型Oryza V3实战15:AutoCalibration程序详解

ORYZA 模型中的 AutoCalibration (v2.1).exe 是用于 ORYZA 模型参数自动校准的可执行程序,在优化 ORYZA 模型参数、提高模型模拟准确性方面具有重要作用。程序能够通过特定算法,在给定的参数取值范围内,自动搜索出一组最优的参数组合,使得模型模拟结果与实际观测数据(如作…

算法-每日一题(DAY12)最长和谐子序列

1.题目链接: 594. 最长和谐子序列 - 力扣(LeetCode) 2.题目描述: 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 给你一个整数数组 nums ,请你在所有可能的 子序列 中找到最长的和谐子序列的…

阿里云-云效自动部署spring boot项目

1.使用云效通过docker自动部署spring boot项目 1.1 spring boot项目配置 # 阿里云的jdk17镜像 FROM registry.cn-zhangjiakou.aliyuncs.com/publicci/openjdk:17-jdk-alpineENV APP_HOME /home/admin/app/# 将target/arms-application.jar 复制到容器中 /home/admin/app/app.…

SQL篇 添加约束、删除约束

SQL篇 添加约束、删除约束 1、相关链接2、约束的增删找查2.1 查看约束(主键、外键、唯一性、检查约束)2.2 查看默认约束2.3 修改约束(添加/编辑/修改)2.3.1 添加主键约束2.3.2 添加外键约束2.3.3 添加唯一性约束2.3.4 添加检查约束…

Python PyTorch 深度学习库 包 timm

文章目录 📦 主要特点🚀 安装方式🧪 使用示例示例1:加载一个预训练模型进行图像分类示例2:获取模型结构信息 🌐 官方资源🔍 常见用途✅ 优势总结 Timm 是一个非常流行且功能强大的 Python 深度学…

tree 命令集成到 Git Bash:可视化目录结构的指南

目录 1. 下载与准备 tree 工具   2. 集成 tree 到 Git Bash 环境   3. tree 命令基础用法详解   4. 使用示例 在软件开发和文件管理中,清晰的目录结构可视化是提高效率的重要手段。tree命令作为 UNIX/Linux 系统的标准工具,能以树形结构递归展…

如何搭建基于RK3588的边缘服务器集群?支持12个RK3588云手机

以下是基于RK3588搭建边缘服务器集群的完整实施方案,涵盖硬件选型、集群架构、软件部署及优化要点: 🖥️ ‌一、硬件集群架构设计‌ ‌节点基础配置‌ ‌核心单元‌:单节点采用RK3588核心板(4A762.4GHz 4A551.8GHz&am…

飞算 JavaAI:我的编程强力助推引擎

文章目录 引言:当Java开发遇上AI助手初识飞算JavaAI:专为Java而生的智能伴侣安装与配置:轻松上手的开始核心功能体验:从需求到代码的全流程革命1. 智能需求分析与拆解2. 智能接口设计3. 表结构智能生成4. 处理逻辑自动梳理5. 高质…

飞算JavaAI—AI编程助手 | 编程领域的‘高科技指南针’,精准导航开发!

目录 一、引言 1.1 什么是飞算JavaAI? 1.2 告别"996的孤独感":AI成为你的编码搭子 1.3 成就感加速器:从"能运行"到"优雅实现" 1.4 极简下载体验:3步开启"开挂"模式 二、深入体验飞…

NPM组件 betsson 等窃取主机敏感信息

【高危】NPM组件 betsson 等窃取主机敏感信息 漏洞描述 当用户安装受影响版本的 betsson 组件包时会窃取用户的主机名、用户名、工作目录、IP地址等信息并发送到攻击者可控的服务器地址。 MPS编号MPS-2nrw-lifd处置建议强烈建议修复发现时间2025-06-30投毒仓库npm投毒类型主…

Apipost 与 Apifox:API 开发管理中的 AI 能力对比

在当今竞争激烈的 API 开发与测试领域,效率与质量是衡量工具优劣的关键指标。Apipost 凭借其强大的 AI 功能,为开发者和测试人员带来了前所未有的便利,而 Apifox 作为该领域的重要参与者,二者在实际应用中究竟有何差异&#xff1f…

Electron 菜单栏深度定制指南:从基础到高级实践

在现代桌面应用开发中,菜单栏作为用户界面的重要组成部分,不仅提供了应用功能的快速访问途径,还直接影响着用户的操作体验。Electron 作为跨平台桌面应用开发框架,为开发者提供了强大而灵活的菜单系统定制能力。本文将全面介绍 El…

QML通过XMLHttpRequest实现HTTP通信

转自个人博客 由于 QML 的 JavaScript 兼容性,我们可以直接使用 JavaScript 的 XMLHttpRequest 对象进行 HTTP 请求。QML 的 XMLHttpRequest 实现与标准浏览器的实现非常相似,但有一些限制和特殊行为需要注意。 而QML实现TCP等其他通信一般就需要借助Qt与…

Spring Boot 内置反向代理(Undertow Proxy)高可用配置

引言 在微服务架构中,反向代理是一个不可或缺的组件,它负责请求转发、负载均衡、安全过滤等关键功能。 通常我们会选择 Nginx、HAProxy 等专业反向代理组件,但在某些场景下,使用 Spring Boot 内置的反向代理功能可以简化架构&am…

ClickHouse 部署

Docker 部署 1、拉取镜像 docker pull clickhouse/clickhouse-server:latest单机版本部署 编写docker-compose.yml version: 3services:clickhouse-server:image: clickhouse/clickhouse-server:22.12container_name: clickhouse-serverports:- "8123:8123"ulimit…

Fiddler中文版抓包工具如何帮助前端开发者高效调试

前端开发早已不再是“写好页面就完事”的工作。随着业务复杂度提升,前端开发者需要直面接口联调、性能优化、跨域排查、HTTPS调试等一系列和网络请求紧密相关的任务。抓包工具成为这些环节中不可替代的得力助手,而 Fiddler抓包工具 因其全面的功能和灵活…

WTL 之trunk技术学习

相比于MFC的消息机制,WTL/ATL的实现更加优雅。后者将win32 API与面向对象技术完美地结合起来,去掉了庞杂的MFC依赖,生成的软件体积更小,运行速度更快。在其中,如何将窗口函数转变为对窗口对象成员函数的调用&#xff0…

Linux——11.软件安装与包管理

Linux 与 Windows 系统在软件安装方式上的差异 Linux: Linux 通过 包管理系统(如 Debian 的 apt、Red Hat 的 yum/dnf)将软件打包为二进制安装包(如 .deb、.rpm),每个包包含程序文件、依赖关系和元数据。包管理系统负责统一管理软件的安装、更新、卸载,并自动处理依赖关…