Python中的对象有私有属性和私有方法吗?

在Python中,对象的私有属性和私有方法在命名上有限定,必须在属性名或者方法名前面加上双下划线"__"(名字后面不能加双下划线),之后便无法从外部直接调用。私有属性名和私有方法名本质都是一个符号或者说一个地址,我们下面的实验环节以私有方法来验证。

1、代码验证

按照惯例,直接上代码:

上图中定义了一个Person类,具备公有方法speak()和私有方法__run(),现在分别调用speak()方法和__run()方法,

运行结果:

从运行结果中可以看出,Person类实例化后,init()方法和speak()方法成功调用,但是__run()方法调用失败,提示"Person没有属性__run"。

至此,一切都很合理,然而真相到底是什么,我们来分析看看。

2、原因分析

还是回到Pycharm,我们用强大的dir()内置函数查看下person对象的属性和方法:

其中有个"_Person__run"非常可以,我们尝试下是否能调用:

居然真的能调用,等等,这不就是私有方法__run()吗?

我们再尝试定义一个私有方法试试:

定义私有方法__play()

运行一下:

看到没?又多了一个"_Person__play"的方法,且能够调用。

也就是说,私有方法虽然无法直接调用,但是可以通过"_类名__私有方法名"的方式调用。

3、总结

在Python中其实并没有真正的私有属性或者私有方法,底层在属性名或者方法名上做了一些处理,让调用者通过原属性名或者方法名无法直接调用,实际上是将真名隐藏了起来,但是通过dir()函数是可以看到,具体的格式如下:

markdown 复制代码
_类名__私有属性名
_类名__私有方法名
相关推荐
鹏码纵横37 分钟前
已解决:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 异常的正确解决方法,亲测有效!!!
java·python·mysql
仙人掌_lz38 分钟前
Qwen-3 微调实战:用 Python 和 Unsloth 打造专属 AI 模型
人工智能·python·ai·lora·llm·微调·qwen3
猎人everest1 小时前
快速搭建运行Django第一个应用—投票
后端·python·django
猎人everest1 小时前
Django的HelloWorld程序
开发语言·python·django
chusheng18402 小时前
2025最新版!Windows Python3 超详细安装图文教程(支持 Python3 全版本)
windows·python·python3下载·python 安装教程·python3 安装教程
别勉.2 小时前
Python Day50
开发语言·python
xiaohanbao093 小时前
day54 python对抗生成网络
网络·python·深度学习·学习
爬虫程序猿3 小时前
利用 Python 爬虫按关键字搜索 1688 商品
开发语言·爬虫·python
英杰.王3 小时前
深入 Java 泛型:基础应用与实战技巧
java·windows·python
安替-AnTi3 小时前
基于Django的购物系统
python·sql·django·毕设·购物系统