首页 > 编程语言 >Python中定义和使用类的私有属性和方法

Python中定义和使用类的私有属性和方法

时间:2024-08-22 17:23:36浏览次数:10  
标签:__ 变量 Python 私有 实例 方法 属性

类的私有属性和方法指的是只能在类的内部使用,而不能在类外使用的属性和方法。

1 单下划线方式

在定义类的属性和方法时,在名字前面加一个下划线,此时表示该属性或方法只能在类的内部使用,而不能在类的外部使用,代码如图1所示。

图1 定义类的私有属性

从图1中可以看出,在类Myclass中定义了两个实例变量,“a”和“_b”。其中变量“a”是公共变量,变量“_b”是私有变量;第5-8行定义了类的两个方法getb()和setb(),分别用来获取和设置变量“_b”的值。使用变量“a”和“_b”的代码如图2所示。

图2 使用变量“a”和“_b”的代码

其中,第10行实例化了Myclass类的一个实例c,对于类的公共变量“a”,可以通过第11-12的代码在类的外部进行设置和获取,而对于私有变量_b,则不能像a一样在类的外部设置和获取,而需要像代码13-14行,通过调用类的函数,在类的内部进行设置和获取。设置类的私有方法与设置类的私有变量类似,只需在方法名前加入一个下划线即可。

使用本方法设置的类的私有变量和方法只是约定俗成的,告诉代码阅读者该属性和方法是私有的,但是并不是严格的语法要求。也就是说,也可以通过像访问和设置共有属性那样访问和设置私有属性,如图3所示。

图3 像访问和设置共有属性那样访问和设置私有属性

2 双下划线方式

2.1 定义和使用私有属性的正确方法

也可以在类的属性和方法名前加入两个下划线将其设置为私有,代码如图4所示。

图4 定义类的私有属性

其中,“a”是类的共有属性,“__b”是类的私有属性,可以在getb()和setb()中获取和设置私有属性“__b”。如果在类外使用“__b”,此时程序会报错,如图4和图5所示。

图4 在类外使用私有变量“__b”的错误代码

图5 报错信息

从图4和图5中可以看出,c是Myclass类的实例,通过该实例在类外调用私有属性“__b”时,程序的报错信息是Myclass类没有“__b”属性。也就是说,在属性名前加两个下划线的方法,从语法上指定了类的私有属性。

要想在类外设置和获取私有变量“__b”,可以通过如图6所示代码。

图6 在类外使用私有变量“__b”的正确代码

getb()和setb()是类Myclass的共有方法,因此可以在类外使用,在这两个方法内部来设置和获取私有方法,从而达到在类外使用私有属性的目的。同理,也可以在方法名前加上两个下划线将其设置为私有方法。

2.2 原因分析

通过如图7所示的代码,查看实例c的属性和方法,得到的结果如图8所示。

图7 查看实例c的属性和方法的代码

图8 实例c的属性和方法

从图8②处可以看出,“a”、“getb”和“setb”分别表示实例的公共属性和公共方法,而图8①的“_Myclass__b”表示实例的私有属性“__b”。也就是说,对于前缀是两个下划线的属性,类会对其进行重命名,将“_类名”加到私有属性名之前。

相关链接1 类的这种重命名行为,叫做name mangling,也就是名称修饰,为了避免类被继承时,与子类的属性发生命名冲突。

因此,可以通过图9所示的代码访问实例的私有属性。

图9 访问实例的私有属性

标签:__,变量,Python,私有,实例,方法,属性
From: https://blog.csdn.net/hou09tian/article/details/141429454

相关文章

  • Python中类的使用4
    在Python中,如果要编写的类是另一个类的特殊版本,可以使用继承。一个类A继承另一个类B,类A将自动获得类B的所有属性和方法,类B叫做父类,而类A叫做子类。假设有一个类是表示“人”的类,而另一个类是表示“学生”的类,因为“学生”是“人”的特殊版本,因此可以把表示“人”的类当作父类,表......
  • python3脚本批量重命名歌曲文件
    场景:歌曲文件名有些混乱 于是想用个脚本批量重命名这些歌曲文件,可以选择【歌曲名-歌手】或【歌手-歌曲名】规范这些文件名脚本如下:importosimportrefrommutagen.id3importID3,TIT2,TPE1frommutagen.mp4importMP4#替换后歌手分隔符REPLACEMENT_STRING......
  • Tree组件的快速定位更新节点的状态,以及修改节点的数据属性等操作
    当我们点击树节点的时候我们常常只能获得树的id,那么我么如何获快速定位到树节点的内容呢,除此之外,当树已经存在时,但是缺少我们想要的内容时,我们想在树节点上添加我们需要的额外的内容时该怎么办,那么就是用以下方法可以快速定位到我们需要的节点并可以快速添加内容/***@params*......
  • 【整理快速通道】python语法import速查
    这段文字是特意发送在除了CSDN以外的其他网站的,如果这段文字出现在CSDN里面,则说明该账号为抄袭账号,关键字索引:抄袭千思的文章目录正文文件夹结构模块调用包内模块1.import2.from...import...3.import...as4.from...import*(不推荐)同级两个模块导入from...import动态导入try.......
  • python对于pyinstaller使用的一些随记
    1.虚拟环境中需要安装对应的pyinstaller  pipinstallpyinstaller(该命令后会安装pyinstaller和pyinstaller-hooks-contrib)注意:如果在当前环境下没有pyinstaller,则会在本机电脑的环境变量中的path中去寻找,如果没有则报错。      此处设置可参考:https://blog.csdn.......
  • Python 实现批量数字二维码生成器
    Python实现批量数字二维码生成器创建时间:2024-08-09一、背景手动逐个生成特定格式和内容的二维码是一项繁琐且耗时的任务。虽然有写二维码工具也可以制作,但是往往有一些限制,为了能够高效、批量生成自定义二维码的需求,开发了这个基于Python的数字二维码生成器应用程序。在实......
  • Python多环境管理神器pyenv+poetry
    pyenv是一个简单而强大的Python版本管理工具,可以在同一台机器上同时安装多个Python版本,并且可以根据应用程序或项目的需求进行快速切换。它的主要功能包括版本的安装、卸载、切换和全局默认版本的设置。 #pyenv工具下载安装:https://codeload.github.com/pyenv/pyenv/zip......
  • python 模块统计
    importos,reos模块是方便与操作系统相交互的模块例如os.listdir(path)列出指定目录的文件os.gitcaw()取得当前工作目录 importre调用正则表达式. 匹配除换行符外的任意字符\W匹配字母或数字\S匹配任意的空白符^匹配开头¥匹配结尾 importsyssys.exit(n)退......
  • 【python】PyQt5中的QFrame控件,控制图形的边框样式、阴影效果、形状等属性
    ✨✨欢迎大家来到景天科技苑✨✨......
  • python小白学习笔记(基于黑马程序员编写03)
    目录二十一、函数基础定义    1.解释:    2.为什么要用函数呢?    3.定义:二十二、函数参数    1.解释:    2.定义:二十三、函数返回值    1.解释:    2.定义:    思考:补充:None    1.解释 ......