Python 3 中真正的私有变量

2023-12-19

所以我知道如何在 python 中使变量“私有”,如下所示:

class Foo:
    def __init__(self):
        self.__private = 'bar'

这“有效”,但无效,如下所示:

foo = Foo()
'__private' in vars(foo) #False
'_Foo__private' in vars(foo) #True

现在,我明白这是在 python 中创建私有变量的方法I like这边走。它允许您修改名称,这样子类就不会意外地覆盖它(因为它以类的名称开头),并且没有人会意外地使用它。它还使您能够更改私有变量如果你知道自己在做什么。而且,这是最好的方法,因为真正的私有变量是不可能的。

或者说我是这么想的。

最近,我在读PEP 8 https://www.python.org/dev/peps/pep-0008/我看到了这一行:

我们在这里不使用术语“私有”,因为在 Python 中没有属性是真正私有的(通常没有不必要的工作量)。

这段引用可以在PEP 8 的“继承”部分的设计 https://www.python.org/dev/peps/pep-0008/#designing-for-inheritance.

请注意“没有通常不必要的工作量”这句话。我现在确信有must是在 python 中获取真正私有变量的一种方法。我该怎么做呢?

我尝试过覆盖__getattribute__,但问题是没有办法判断调用是否来自类内部(据我所知)。

另外,__dict__尝试执行此操作时,属性很烦人,因为它保存对所有实例变量的引用。

我也想到了元类,但那些似乎有同样的问题__getattribute__.

想法?


Note:我知道任何在 python 中创建真正私有变量的方法都应该never在生产代码中完成。我只是想知道如何could做完了。


我尝试过覆盖获取属性,但问题是没有办法判断调用是否来自类内部(据我所知)。

您可以使用inspectmodule 来查找调用函数的名称和模块,您可以将其与白名单进行比较。

But inspect也有getattr_static,它可以绕过任何__getattribute__.


Python 中没有什么是真正私有的。有一些方法可以让访问变得困难,但总有办法绕过这些方法。

那么唯一的解决方案是在当前的 Python 解释器之外。您可以使用其他更安全的语言的外部函数接口,或者对相同或在子进程中运行的另一个Python解释器进行远程过程调用(例如xmlrpc),甚至可以以具有不同权限的不同用户身份运行。私有变量和所有允许访问它的函数将位于当前解释器之外。那么就没办法检查了。

这类特权分离 https://en.wikipedia.org/wiki/Privilege_separation甚至是其中之一规定的用例 https://pyro4.readthedocs.io/en/stable/intro.html#what-can-you-use-pyro-for用于 Pyro RPC 库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 3 中真正的私有变量 的相关文章

  • 按 A 列删除重复项,保留 B 列中具有最高值的行

    我有一个数据框 A 列中有重复值 我想删除重复项 保留 B 列中具有最高值的行 So this A B 1 10 1 20 2 30 2 40 3 10 应该变成这样 A B 1 20 2 40 3 10 我猜想可能有一种简单的方法可以做到
  • 每个刻度标签都有不同的颜色

    我正在尝试使用 matplotlib python 3 5 创建一个散点图 其中 x 轴上的每个刻度都有不同的颜色 这怎么可能 例如 假设 x 刻度为 Mo Tu We Th Fr Sa Su 现在我希望 Mo 是绿色的 Tu 是蓝色的 等
  • 如何创建毫秒粒度的 Python 时间戳?

    我需要一个自纪元以来的毫秒 ms 时间戳 这应该不难 我确信我只是缺少一些方法datetime或类似的东西 实际上微秒 s 粒度也很好 我只需要亚 1 10 秒的计时 例子 我有一个每 750 毫秒发生一次的事件 假设它检查灯是否打开或关闭
  • argparse 更改参数的定义

    我按如下方式设置参数解析器 parser argparse ArgumentParser parser add argument point help enter a point e g 2 3 4 parser parse args po
  • Buildozer Numpy RuntimeError:工具链损坏:无法链接简单的 C 程序

    用 Python 编写我的第一个 Android 应用程序并使用 Buildozer 对其进行打包 因为稍后在项目中需要使用numpy 所以我尝试打包以下测试代码 import numpy import kivy kivy require
  • 如何列出静态链接的 python 版本中可用的所有 openssl 密码?

    在python 2 7 8到2 7 9升级中 ssl模块从使用更改为 DEFAULT CIPHERS DEFAULT aNULL eNULL LOW EXPORT SSLv2 to DEFAULT CIPHERS ECDH AESGCM D
  • 如何在 iPython 中获取最后分配的变量的值?

    我是一个完全的 iPython 新手 但我想知道是否有办法获取最后分配的变量的值 In 1 long variable name 333 In 2
  • Tkinter 按钮鼠标右键和左键单击有不同的命令

    我正在用 Python 制作扫雷游戏 并使用 tkinter 库来创建 gui 有没有 绑定到 tkinter 按钮两个命令的方法 一个是右键单击按钮时的命令 另一个是单击左键时的命令 通常 按钮仅设计用于单击 但 tkinter 允许您为
  • 更新或插入 MySQL Python

    如果记录已存在 我需要更新一行 如果不存在 我需要创建一个新记录 我理解 ON DUPLICATE KEY 将使用 MYSQLdb 完成此操作 但是我无法使其正常工作 我的代码如下 cursor database cursor cursor
  • 在Python中将用户昵称转换为正式名字

    我正在尝试根据 Python 中的用户名字和姓氏映射来自不同系统的用户 一个问题是 名字在很多情况下都是 昵称 例如 对于用户来说 他的名字在一个系统中是 Dave 而在另一个系统中是 David python 中有没有简单的方法可以将这些
  • 将 Selenium 与 PyCharm CE 结合使用

    我正在尝试将 Selenium 与 PyCharm CE 一起使用 我已经使用 pip install Selenium 安装了 Selenium 并且可以通过终端使用它 但是当我尝试将它与 PyCharm 一起使用时 出现导入错误 Imp
  • 我无法设置顶级标题

    我想为 TopLevel 设置标题 但 TopLevel 显示 Root 的标题 我认为我的下一个脚本与 TkInter 文档中的示例相对应 但给了我不好的结果 你能解释一下 为什么我的设置master title 顶部 in 应用程序顶部
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • Google App Engine self.redirect() POST 方法

    在 GAE Python 中 使用 webApp 框架 调用 self redirect some url 通过 GET 方法将用户重定向到该 URL 是否也可以通过带有一些参数的 POST 方法进行 重定向 如果可以的话 怎样做 Than
  • Django admin.py 未知命令:'collectstatic'

    我已经从 django 1 2 7 升级到 django 1 5 1我正在使用 python 2 6 6当我尝试跑步时python manage py collectstatic i get 未知命令 collectstatic 从我的设置
  • 出于安全目的,您是否有理由不执行自己的算法来打乱 ID?

    我计划实现我自己的非常简单的 哈希 公式 为具有多个用户的应用程序添加一层安全性 我目前的计划如下 用户创建一个帐户 此时后端会生成一个 ID ID 通过公式运行 假设 ID 57 8926 36 7 或同样随机的东西 然后 我将新的用户
  • gstreamer 中的无缝视频循环

    我正在尝试使用 gstreamer 循环播放视频 它是 python 绑定 第一次尝试是hook EOSmessage并为管道生成搜索消息 import gi gi require version Gst 1 0 from gi repos
  • 有没有比 Python 内置 == 运算符更快的方法来测试两个列表是否具有完全相同的元素?

    如果我有两个列表 每个列表有 800 个元素长并填充整数 有没有比使用内置元件更快的方法来比较它们具有完全相同的元件 如果没有 则短路 操作员 a 6 2 3 88 54 486 b 6 2 3 88 54 486 a b gt gt gt
  • 在Python中通过sys.stdout写入unicode字符串

    暂时假设一个人无法使用print 从而享受自动编码检测的好处 所以这给我们留下了sys stdout 然而 sys stdout太蠢了不做任何合理的编码 http bugs python org issue4947 现在人们阅读 Pytho
  • Pandas:如何删除以 nan 作为列名的多个列?

    根据标题 这是一个可重现的示例 raw data x this that this that this np nan np nan np nan np nan np nan np nan y np nan np nan np nan np

随机推荐

  • 向后台进程发送信号

    我应该向后台进程发送哪个信号以将其移至前台 SIGTTIN SIGTOU 还是 它不是直接控制作业是前台还是后台的信号 这些作业 通常 处于 shell 的控制之下 例如 在bash 如果执行 pax gt sleep 3600 pax g
  • Kubernetes Horizo​​ntal Pod Autoscaler 中的 Pod 副本缩减是如何工作的?

    我的理解是 在 Kubernetes 中 使用 Horizo ntal Pod Autoscaler 时 如果targetCPUUtilizationPercentage字段设置为 50 并且所有 Pod 副本的平均 CPU 利用率高于该值
  • UIAlertController 'UIAlertAction' 标签/用户数据或 Swift 中的任何内容

    在我的 iOS 操作表中 我显示了 JSON 字典中的名称 Name Doctor for Disease AAA Doctor id 21 Name Doctor for Disease BBB Doctor id 22 Name Doc
  • 即使 INSERT IGNORE 忽略插入也会锁定表吗?

    在 MySQL 中 如果我有一个 INSERT IGNORE 命令 由于唯一性约束 该命令最终不会插入到表中 它是否询问并等待写锁 或者MySQL是否识别IGNORE关键字 并在写锁之前使用读锁 并且只有当它确实需要写时才请求写锁 这取决于
  • 在jquery中将文本框设置为只读并将背景颜色设置为灰色

    再会 我想在我的中创建一个文本框jsp成为readonly其背景颜色为灰色disable在 Jquery 中 以下是我的代码 if a billAccountNumber attr readonly true 我不喜欢使用attr disa
  • 服务在 SQL Server 配置管理器中不可见

    我已经安装了 SQL Server 2008 Management Studio Express 32 位 我已成功安装它 但当我尝试连接 SQL Server 时出现错误 然后我想从 SQL Server 配置管理器打开服务 但我看不到任
  • 将函数传递给子例程时,虚拟过程“f”中的接口不匹配

    我正在尝试编写一个具有两个参数的子例程 用于最小化 数组x任意长度 一个函数f接受该长度的数组并返回一个标量 示例模块 module foo contains subroutine solve x f real dimension inte
  • 如何通过 iPhone 上的网页检查应用程序是否已安装

    我想创建一个网页 一个将 iPhone 重定向到应用商店 https en wikipedia org wiki App Store 28iOS 29如果 iPhone 没有安装该应用程序 但如果 iPhone 安装了该应用程序 我希望它打
  • 在面板内的控件顶部绘图 (C# WinForms)

    我知道这个问题已经被问过多次 但到目前为止我还没有找到一个好的解决方案 我有一个带有其他控件的面板 我想在它上面以及面板中所有控件的顶部画一条线 我遇到了 3 种解决方案 它们都没有按照我想要的方式工作 获取桌面 DC 并在屏幕上绘制 如果
  • chm hhk 中的关键字标签

    我目前正在检查 CHM 的二进制索引构建 但我注意到示例项目中的一些 hhk 例如生成的 Sphinx 有一个 关键字 标签 该标签似乎没有记录在chmspec http www nongnu org chmspec latest Site
  • 有没有办法通过反射获取类型的别名?

    我正在编写一个简单的代码生成应用程序来从 DB2 数据库模式构建 POCO 我知道这并不重要 但我更喜欢使用类型别名而不是实际的系统类型名称 如果可用 即 int 而不是 Int32 有没有一种方法可以使用反射来获取类型的别名而不是实际类型
  • 在 VS 中以编程方式打开解决方案时,如何才能将文件添加到最近项目的 MRU 列表中?

    当使用以下方式在加载项 扩展 在我的例子中为 VS2012 中以编程方式打开解决方案时解决方案 打开 http msdn microsoft com en us library vstudio envdte solution open as
  • 如何在 Python 中进行相对导入?

    想象一下这个目录结构 app init py sub1 init py mod1 py sub2 init py mod2 py 我正在编码mod1 我需要从中导入一些东西mod2 我该怎么做呢 I tried from sub2 impo
  • TFS 迭代积压仅显示用户故事而不是任务

    在使用敏捷流程模板的 TFS 2015 中 board对于 故事 待办事项列表仅显示故事 当前迭代的面板显示故事下的所有任务 这对于大多数团队来说都是有意义的 我们正在将我们的工作分解成比平常更小的故事 因此避免任务崩溃 https www
  • python 尝试一下 except

    我的问题很简单 我有一个try except代码 在尝试中 我进行了一些http请求尝试 在例外中 我有几种方法来处理我遇到的异常 现在我想在我的代码中添加一个时间参数 这意味着尝试只会持续 n 秒 否则用 except 捕获它 用自由语言
  • 如何在.NET 6库中引用ASP.NET Core 6类型?

    我正在为我的组织开发内部图书馆 我需要引用通常 属于 网络应用程序的某些类型 例如 提供一些扩展 WebApplicationOptions HttpContext 如果我使用
  • Python 偏导数简单

    我对用 Python 计算偏导数感兴趣 我见过计算单变量函数导数的函数 但没有见过其他函数 找到具有以下功能的东西就太好了 f x y z 4xy xsin z x 3 z 8y part deriv function f variable
  • Mercurial如何检索执行hg推送的真实用户

    在服务器站点上 hg tip显示执行 hg Push commit 的用户 数据取自 hgrc 的 user 部分 我可以把我喜欢的任何东西放在那里 但如何在服务器上了解真正这样做的人hg push 你需要维护一个pushlog手动跟踪这一
  • 在 Javascript 中将图像转换为二进制数据或字符串

    我正在使用 Chrome Extension 上的 XMLHttp Request 将图像文件上传到 TWITPIC 我需要将图像作为有效负载发送 有没有办法做到这一点 我找到了这个链接在javascript中将图像转换为二进制数据 htt
  • Python 3 中真正的私有变量

    所以我知道如何在 python 中使变量 私有 如下所示 class Foo def init self self private bar 这 有效 但无效 如下所示 foo Foo private in vars foo False Fo