首页 / 知识
为什么Python的私有方法事实上并不是真的私有?
2023-04-15 19:46:00

Python为我们提供了在类中通过在名称前加上双下划线来创建"私有"方法和变量的能力,就像这样:
这笔交易是什么? ! 我将为那些不太明白的人解释一下。
我所做的是创建一个类,它有一个公共方法和一个私有方法并实例化它。 接下来,我调用它的公共方法。
接下来,我尝试调用它的私有方法。
这里一切看起来都很好;我们不能打电话。事实上,它是"私人的"。其实不是。在对象上运行dir()揭示了python为所有"私有"方法神奇地创建的一个新方法。
这个新方法的名称总是下划线,后跟类名和方法名。
封装就这么多,是吧? 无论如何,我总是听说Python不支持封装,所以为什么还要尝试呢?到底发生了什么事? 名称置乱用于确保子类不会意外地覆盖其超类的私有方法和属性。它的设计不是为了防止外界故意进入。 例如:
当然,如果两个不同的类具有相同的名称,它就会崩溃。 私有函数的例子
当我第一次从Java转到Python时,我讨厌这样。吓死我了。 今天,它可能是我最喜欢Python的一点。 我喜欢在一个平台上,在这里人们彼此信任,并且不觉得他们需要围绕他们的代码建立不可穿透的墙。在强封装语言中,如果一个API有一个bug,而您已经知道出了什么问题,您可能仍然无法解决它,因为所需的方法是私有的。在Python中,态度是:"确定"。如果你认为你了解情况,也许你已经读过了,那么我们只能说"祝你好运!" 请记住,封装与"安全性"或让孩子远离草坪甚至没有微弱的关系。它只是应该用来使代码库更容易理解的另一种模式。 从http://www.faqs.org/docs/diveintopython/fileinfo_private.html
常用的短语是"我们都是自愿的成年人"。通过在前加一个下划线(不要暴露)或两个下划线(隐藏),您可以告诉类的用户,您希望成员在某种程度上是"私有的"。然而,你相信其他人的行为是负责任的,并且尊重他们的行为,除非他们有令人信服的理由不这样做(例如调试器,代码完成)。 如果您确实需要一些私有的东西,那么您可以在扩展中实现它(例如,在C语言中实现CPython)。然而,在大多数情况下,您只需要学习python的方法即可。 这并不是说您绝对不能在任何语言(c++中的指针算术、. net / java中的反射)中避开成员的私密性。 关键是,如果不小心调用了private方法,就会得到一个错误。但是如果你想搬起石头砸自己的脚,尽管去做吧。 编辑:您不会试图通过oo封装来保护您的东西,是吗? 当模块属性名以单个下划线(例如_foo)开头时,也存在类似的行为。 当使用
然而,这是一种约定,而不是语言约束。这些不是私有属性;它们可以被任何进口商引用和操纵。有些人认为,正因为如此,Python不能实现真正的封装。 这只是语言设计的选择之一。在某种程度上,它们是合理的。他们这样做了,所以你需要走很远的路去尝试调用这个方法,如果你真的非常需要它,你一定有一个很好的理由! 调试钩子和测试作为可能的应用程序出现在脑海中,当然要负责任地使用。 的确,您仍然可以解决这个问题,它甚至比其他语言更简单(顺便说一句,其他语言也允许您这样做),但是如果Python程序员关心封装,就不会这样做。 这是Python 3.4的行为:
https://docs.python.org/3/tutorial/classes.html#tut-private
即使这个问题很老了,我希望我的片段能有所帮助。 私有方法和属性最重要的关注点是告诉开发人员不要在类之外调用它,这就是封装。人们可能会误解封装的安全性。当有人故意使用您提到的那种语法时(如下所示),您不希望封装。
我是从c#迁移过来的,一开始我也觉得很奇怪,但过了一段时间,我意识到只有Python代码设计人员考虑OOP的方式不同。
据我所知,他们不可能是私人的。如何保护隐私? 显而易见的答案是"私有成员只能通过 |
最新内容
相关内容
linux变量释放命令?
linux变量释放命令?,系统,环境,名称,工具,官网,简介,变量,环境变量,命令,内存,如何手动释放Linux内存?1、也就是说可以通过修改/proc中的文件,linux调出变量的命令?
linux调出变量的命令?,系统,工作,工具,信息,地址,代码,标准,名称,官网,命令,linux环境变量怎么设置方法方法一:用export命令,输入“export PATH=linux解释命令解释符?
linux解释命令解释符?,系统,数据,名称,基础,工作,工具,状态,命令,脚本,进程,Linux中的sh命令的详细解释sh是linux中运行shell的命令,是shell的linuxls命令解释?
linuxls命令解释?,信息,系统,标准,命令,时间,名称,数据,文件,目录,观察,LS(LINUX中ls命令)详细资料大全ls命令是linux下最常用的命令之一,ls跟dlinux命令主机名变量?
linux命令主机名变量?,系统,主机名,查询系统,命令,终端,编辑,提示符,根目录,文件,用户,linux如何修改主机名首先,以 root 用户身份登录 Red Hatlinux各种命令的解释?
linux各种命令的解释?,地址,工作,系统,信息,命令,目录,时间,管理,控制台,常用命令,linux的常用命令有哪些呢???希望带上解释date:打印或者设置linux路径命令解释?
linux路径命令解释?,系统,信息,设备,数据,工具,命令,文件,标准,发行,时间,linux查看路径命令1、linux命令如果记不得,可以使用man命令来查看某linux变量是一个命令?
linux变量是一个命令?,系统,信息,变量,名称,官网,地址,环境,代码,地方,命令,$在linux里什么意思所谓$:也就是咱们平常说的“命令提示符”也就是linux中变量取余命令?
linux中变量取余命令?,地址,工作,系统,数据,信息,命令,分析,目录,控制台,文件,linux系统常用操作命令linux常用命令有pwd命令、cd命令、ls命令加载变量的linux命令?
加载变量的linux命令?,工具,系统,名称,环境变量,环境,命令,用户,文件,变量,方法,linux如何添加自定义变量1、方法一:用export命令,输入“exportlinux进程命令解释?
linux进程命令解释?,系统,状态,基础,进程,信息,时间,命令,实时,软件,名称,Linux中用于进程显示的top命令使用实例集锦1、Top 命令输出: 首先,让linux关机命令解释?
linux关机命令解释?,系统,工作,命令,时间,银河,信息,用户,级别,终端,指令,linux关机命令1、shutdown命令 shutdown命令用于安全关闭Linux系统