Python – 如何在类中定义公共、私有和受保护变量

python - 如何在类中定义公共、私有和受保护变量

介绍

python 作为一种面向对象的编程语言,提供了多种将数据封装在类中的方法。
这种封装的关键方面之一是类变量的可见性,类变量可以分为公共变量、受保护变量和私有变量。在本文中,我们将探讨如何在 python 类中定义公共、私有和受保护变量。

这些变量的行为与其他编程语言非常不同。这些访问控制只是python中的命名约定,而不是对象的实际隐藏。

1. 公共变量

公共变量是最容易访问的变量类型。可以从课堂内外的任何地方访问它们。在python中,除非明确定义,否则所有类变量默认都是公共的。

示例:

class myclass:    def __init__(self, name):        self.name = name  # public variableobj = myclass("john")print(obj.name)  # accessible outside the class#output : john

在此示例中,name 是一个公共变量。您可以从类外访问和修改它,没有任何限制。

2. 受保护的变量

受保护的变量只能在类及其子类中访问。虽然 python 不强制执行严格的访问控制,但表示变量受保护的约定是在其名称前添加一个下划线 (_)。

立即学习“Python免费学习笔记(深入)”;

示例:

class myclass:    def __init__(self, name, age):        self._age = age  # protected variableclass childclass(myclass):    def display(self):        print(f"age: {self._age}")  # accessible within a subclassobj = childclass("john", 30)obj.display()  # output: age: 30

在此示例中,年龄是受保护的变量。虽然 python 不会阻止您直接在类外部访问它,但这样做违背了预期用途。

3. 私有变量

私有变量只能在定义它们的类中访问。 python 通过在变量名前添加双下划线 (__) 来表示私有变量。这会触发名称修改,从而使从类外部访问私有变量变得更加困难(但并非不可能)。

示例:

class myclass:    def __init__(self, name, age, salary):        self.__salary = salary  # private variable    def display_salary(self):        print(f"salary: {self.__salary}")  # accessible within the classobj = myclass("john", 30, 50000)obj.display_salary()  # output: salary: 50000# trying to access the private variable outside the classprint(obj.__salary)  # raises attributeerror

在这个例子中,salary 是一个私有变量。如果您尝试直接从类外部访问它,python 将引发 attributeerror。但是,您仍然可以使用名称损坏的版本来访问它,尽管不鼓励这样做。

名称修改示例:

print(obj._MyClass__salary)  # Output: 50000

这行代码演示了如何在内部重命名私有变量以包含类名称,从而使它们更难访问。

概括

公共变量:可从任何地方访问;没有下划线。受保护的变量:在类及其子类中可访问;以单个下划线 (_) 为前缀。私有变量:只能在类内部访问;以双下划线 (__) 为前缀。

虽然 python 的访问控制基于命名约定而不是严格执行,但遵循这些约定有助于保持代码的清晰度和完整性。了解如何定义和使用公共变量、受保护变量和私有变量对于 python 中有效的面向对象编程至关重要。

以上就是Python – 如何在类中定义公共、私有和受保护变量的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1349785.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 13:12:08
下一篇 2025年12月13日 13:41:33

相关推荐

  • Python Turtle动画优化:利用循环消除重复代码提升效率

    本文探讨在Python Turtle模块中处理多个动画对象时,如何通过迭代和优化代码结构来消除重复、提升效率。通过将多个Turtle对象组织起来并利用循环进行统一操作,不仅能显著减少代码量,还能有效同步它们的行为,从而实现更简洁、易维护且可扩展的动画编程。 重复代码的困境 在python的turtl…

    2025年12月14日
    000
  • Django连接PostgreSQL的密码认证失败问题解析与解决方案

    本文旨在解决Django应用连接本地PostgreSQL数据库时遇到的“password authentication failed for user postgres”错误,尤其是在WSL环境下。尽管pg_hba.conf可能配置为trust认证方式,但Django的数据库连接配置通常要求数据库用…

    2025年12月14日
    000
  • 解决Django测试数据库中PostgreSQL不区分大小写排序规则缺失问题

    本文详细阐述了在Django 4.2及更高版本中使用db_collation定义不区分大小写排序规则时,测试数据库中出现的collation does not exist错误。通过分析RunPython操作与CreateCollation的正确用法,提供了使用schema_editor.execut…

    2025年12月14日
    000
  • python引用计数机制的使用

    Python通过引用计数机制管理内存,当对象引用计数为0时自动回收;每次赋值、容器存储或函数传参会增加引用,del或重新赋值则减少;sys.getrefcount()可查看引用数但会临时加1;循环引用导致计数无法归零,需gc模块清理;weakref可创建不增加引用的弱引用,避免内存泄漏。 Pytho…

    2025年12月14日
    000
  • Python中高效模拟无重叠球体随机运动

    本文探讨了在Python中高效模拟大量无重叠球体在特定空间边界内进行随机运动的方法。针对传统逐个球体移动并检查重叠的低效问题,我们提出了一系列优化策略,包括利用scipy.spatial.cKDTree的批量查询和多核并行能力,以及使用Numba进行即时编译以加速计算密集型代码段,从而显著提升模拟性…

    2025年12月14日
    000
  • Tkinter控件动态更新:利用 after 方法实现外部数据实时显示

    本文详细介绍了在Tkinter应用程序中如何实现控件基于外部数据(如文件内容)的周期性自动更新。通过利用Tkinter的after方法,开发者可以高效地调度函数以定时刷新界面元素,确保UI与外部数据源保持同步。文章提供了具体的代码示例和实践建议,帮助读者构建响应式、动态的Tkinter应用。 Tki…

    2025年12月14日
    000
  • 如何使用Selenium和JavaScript提取HTML标签内的直接文本内容

    本教程详细介绍了如何使用Selenium结合JavaScript,从HTML标签中精确提取所有非嵌套在子元素内的直接文本内容。针对标准Selenium方法无法满足需求的场景,我们通过遍历DOM节点的子节点并识别文本节点,构建了一个高效的JavaScript解决方案,确保获取到标签内部的纯文本信息,并…

    2025年12月14日
    000
  • 使用 Tkinter 实现控件的周期性数据更新

    本文详细介绍了如何在 Tkinter 应用中实现控件(如 Label)的周期性数据更新,使其能够实时反映外部数据源(例如文件)的变化。核心方法是利用 Tkinter 的 after() 函数,在主事件循环中调度更新任务,从而避免阻塞 UI。文章提供了具体的 Python 代码示例,并讨论了在数据获取…

    2025年12月14日
    000
  • Selenium中提取HTML标签内所有直接文本节点内容的高级技巧

    本文旨在解决Selenium中提取HTML标签内所有直接文本节点内容的挑战,而非获取子元素内部的文本。通过使用driver.execute_script执行JavaScript代码,遍历目标元素的直接子节点,并精确识别和拼接Node.TEXT_NODE类型的内容,从而实现高效且准确的文本提取,避免了…

    2025年12月14日 好文分享
    000
  • Python中动态更新对象属性:利用字典映射与setattr()处理字符串引用

    本教程探讨了如何在Python中根据外部数据(如数据库查询结果)动态更新对象属性,当对象名和属性名以字符串形式存在时面临的挑战。文章详细介绍了如何通过构建对象映射字典并结合内置的setattr()函数,安全高效地实现这一需求,避免了eval()等不推荐的方法,并提供了清晰的代码示例。 问题描述:从字…

    2025年12月14日
    000
  • python pytesseract库是什么

    pytesseract是基于Tesseract引擎的Python OCR库,可将图像中的印刷或手写文字识别为文本,支持多语言并可结合Pillow或OpenCV使用;需先安装pytesseract包和Tesseract-OCR程序,再通过image_to_string()方法提取文字,如处理中文需指定…

    2025年12月14日
    000
  • Tkinter实现外部数据实时更新GUI组件的教程:利用after()方法

    本教程详细讲解如何在Tkinter应用中实现GUI组件(如Label)的实时更新,以响应外部数据源的变化。通过利用Tkinter的after()方法,我们可以在不阻塞主事件循环的前提下,周期性地读取外部数据并刷新界面,确保用户界面的流畅性和响应性。 理解Tkinter的事件循环与UI更新 tkint…

    2025年12月14日
    000
  • Python中高效检测数字组合可用性:Set与Counter的应用

    本文旨在解决在给定数字字符串中检查非连续数字组合是否可用的问题。传统字符串匹配无法有效处理此类场景。我们将介绍如何利用Python的set数据结构处理唯一数字组合的检测,以及如何使用collections.Counter来精确处理包含重复数字的组合检测,从而实现灵活且准确的组合可用性判断。 一、问题…

    2025年12月14日
    000
  • Discord.py 教程:实时检测用户状态变化并发送通知

    本教程将指导您如何使用 Discord.py 库监听并响应 Discord 服务器中成员的状态变化。我们将重点介绍正确的事件处理函数 on_member_update(),并演示如何配置必要的 Intents、比较用户状态,以及在状态发生改变时向指定频道发送通知消息,确保您的 Discord 机器人…

    2025年12月14日
    000
  • python如何处理文件

    Python通过open()函数处理文件,推荐使用with语句确保文件安全关闭。1. 用’r’、’w’、’a’等模式打开文件,配合encoding=’utf-8’避免中文乱码;2. 可逐行读取节省内存,或…

    2025年12月14日
    000
  • Python使用Xlwings复制Excel单元格多色字体及复杂格式教程

    在使用Python处理Excel时,openpyxl在复制单元格数据及基础格式方面表现良好,但对于包含多种字体颜色等富文本格式的单元格,其能力存在局限。本教程将深入探讨openpyxl在此类场景下的不足,并提供一个基于xlwings库的有效解决方案,通过模拟Excel原生复制粘贴功能,轻松实现复杂格…

    2025年12月14日
    000
  • Python代码的风格是什么?

    Python代码风格遵循PEP 8规范,使用snake_case命名变量和函数,CamelCase命名类,常量全大写;用4个空格缩进,逗号后加空格,行不超过79字符,函数间空两行,导入语句分组并按标准库、第三方库、本地库顺序排列。 Python代码的风格主要遵循PEP 8规范,这是官方推荐的编码风格…

    2025年12月14日
    000
  • Django连接PostgreSQL时“密码认证失败”问题解析与解决方案

    本文详细阐述了Django应用在连接本地PostgreSQL数据库时,即使pg_hba.conf配置为trust模式,仍可能遭遇“密码认证失败”错误的原因与解决方案。核心在于,Django的数据库配置通常要求用户拥有明确的密码,即使PostgreSQL服务器在trust模式下不强制要求。教程将指导您…

    2025年12月14日
    000
  • Python turtle 模块:利用循环优化多对象操作的重复代码

    本文探讨了如何在Python turtle 模块中,通过迭代处理多个turtle对象来消除重复代码,从而提升代码效率和可维护性。针对多个turtle实例需要执行相似但参数可能不同的操作场景,教程展示了如何使用嵌套循环将冗余代码精简为简洁高效的结构,实现更优雅的多对象控制。 引言:重复代码的困境 在p…

    2025年12月14日
    000
  • Python中大规模球体无重叠随机移动模拟的性能优化实践

    本文探讨了在Python中高效模拟大量无重叠球体在特定空间内随机移动的方法。针对初始实现中存在的性能瓶颈,文章详细介绍了如何通过优化近邻搜索(使用cKDTree的批处理查询和多核并行)、以及利用Numba进行JIT编译来显著提升模拟速度,实现更流畅、快速的物理模拟。 1. 问题背景与初始实现分析 在…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信