从类访问私有模块变量

2024-02-29

我正在尝试理解 python 作用域规则。为此,我尝试从同一模块中的类访问“非常私有”变量

bar = "bar"
_bar = "underscore"
__bar = "double underscore"

def foo():
    print bar
    print _bar
    print globals()["__bar"]
    print __bar

class Foo:
    def __init__(self):
        print bar
        print _bar
        print globals()["__bar"]
        print __bar #NameError: global name '_Foo__bar' is not defined

foo()
Foo()

它失败了NameError。我在规范中找不到任何相关内容。那么,为什么它会失败以及这种行为在哪里描述?


在类定义中,所有名称starting双下划线被破坏;重写以包含类名作为前缀。

此功能支持在类中将名称标记为“私有”,并防止其被子类覆盖。请参阅标识符文档 http://docs.python.org/2/reference/expressions.html#atom-identifiers:

私人名称修改:当类定义中文本出现的标识符以两个或多个下划线字符开头且不以两个或多个下划线结尾时,它被视为该类的私有名称。在为其生成代码之前,私有名称会转换为更长的形式。该转换将在名称前面插入类名称,删除前导下划线并插入一个下划线。例如,标识符__spam发生在一个名为Ham将转变为_Ham__spam。此转换独立于使用标识符的语法上下文。如果转换后的名称非常长(超过 255 个字符),则可能会发生实现定义的截断。如果类名仅包含下划线,则不进行任何转换。

最好不要在模块全局变量上使用双下划线前缀;没有必要这样做,一个下划线就足以表明该值是模块内部的。

如果您坚持使用这样的值,请创建一个未损坏的别名,或使用globals()[name].

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

从类访问私有模块变量 的相关文章

随机推荐

  • Flask-SQLAlchemy 超时错误

    我的后端配置是 乌班图12 04 Python 2 7 烧瓶0 9 Flask SQLAlchemy Postgres 9 2 我收到此错误消息 TimeoutError QueuePool limit of size 5 overflow
  • 如何在代码中使用Python覆盖率

    我想从代码内部捕获覆盖范围 我尝试了下面的一种 但出现错误 请参阅以下链接了解覆盖 API https coverage readthedocs io en v4 5 x api html api https coverage readth
  • 为什么我已经安装了 RabbitMQ 却找不到“rabbitmq.config”文件?

    我正在运行 Red Hat Enterprise Linux 7 2 我已经安装了 RabbitMQ 并systemctl status rabbitmq server shows rabbitmq server service LSB 启
  • 使用多个实例和背景大小时,Firefox 背景图像闪烁

    因此 我在页面上有几个共享背景图像的元素 我的页面正在使用 bootstrap 并且两个元素都是 3 列宽度的容器 每个都有一个背景并通过背景大小包含 在第二个元素上 我将背景宽度设置为 90 因此它比其他背景稍小 在 Firefox 中
  • 如何在 Objective-c 中的应用程序的资源文件夹中保存文件

    我正在为 iPhone 开发一个 Objective C 应用程序 我的问题是我的应用程序必须保存从网址获取的图像 我认为该文件夹是只读的 这是我保存图像的代码 void banner NSString path NSData imageD
  • UITableView:自定义标题标题视图不显示

    我想显示一个带有自定义标题标题的表格 这table view被附加到一个controller class实现了tableview delegate和数据源协议 但不是其子类UIViewController因为该表是要显示在另一个表视图之上的
  • 使用 fread() 选择行和列,就像 read.csv.sql() 那样

    I know fread相对较新 但它确实提供了很大的性能改进 我想知道的是 您可以从您正在阅读的文件中选择行和列吗 有点像什么read csv sql做 我知道使用select的选项fread我们可以选择要读取的列 但是如何只读取满足特定
  • 强类型定义[重复]

    这个问题在这里已经有答案了 有什么方法可以制作类型的完整副本 以便可以在模板推导上下文中区分它们 举个例子 include
  • 如何在连接表中按条件接收对象

    我有桌子Games and Badges他们通过桌子连接BadgesGames t integer badge id t integer game id t boolean shown default false I have Game对象
  • Xcode - 共享应用程序 - PackageApplication 失败,退出代码 1

    我使用 Xcode 4 1 为我的 iPhone 应用程序创建了一个临时发行版 目标成功构建并生成了一个存档文件 我可以在管理器中看到该文件 然后我单击 共享 这允许我选择 ipa 和我的分发配置文件 但是 在我点击 下一步 后 管理器崩溃
  • Spark:按元组/列中的多个值对 RDD 进行排序

    所以我有一个RDD如下 RDD String Int String 举个例子 b 1 a a 1 b a 0 b a 0 a 最终结果应该类似于 a 0 a a 0 b a 1 b b 1 a 我该怎么做这样的事情 尝试这个 rdd sor
  • Heroku/GoDaddy:将裸域名发送到 www [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在尝试找出如何让我的网站的裸域重定向到 www 域 我正在使用 Heroku 并拥有 GoDaddy 的域名 由于 Heroku 我的 A 记录已
  • 没有http服务器的Socket.IO?

    我目前正在使用 Nodejs 的 Socket IO 在服务器和一些客户端之间共享一些实时信息 客户端应该只与服务器通信 而不是彼此通信 在 Windows 上一切都很好 我可以共享信息 但当它把东西放到 Linux vps 上时 我遇到了
  • “在负可变长度后行中使用 \G 来限制后行回溯多远”的示例

    在很棒的正则表达式模块的 pypi 页面中 https pypi python org pypi regex https pypi python org pypi regex 据说 G 可以 在负可变长度后向中使用 以限制后向回溯的距离 非
  • 如何在有或没有 Pig 的情况下使用 Cassandra 的 Map Reduce?

    有人可以解释 MapReduce 如何与 Cassandra 6 配合使用吗 我已经阅读了字数统计示例 但我不太明白 Cassandra 端与 客户端 端发生的情况 https svn apache org repos asf cassan
  • 创建已包含 Nuget 包参考的 Visual Studio 项目模板?

    我想创建一个 Visual Studio 2010 项目模板 它本质上是一个 ASP net 3 5 Webforms 应用程序 但是 我想自动添加 NuGet 包引用 如果需要 我可以将实际的 nupkg 与模板捆绑在一起 但我想知道是否
  • WordPress:“post_name”的 WP_Query 搜索条件

    我正在使用 WP Query 非常标准 一切都很好 但是 我需要进行一项特定的修改 如果用户在 URL 中输入特定的帖子名称 则搜索将仅返回与该 post name 值匹配的帖子 请参阅下面的代码 其中包含有关特定行不起作用的注释
  • MySQL:启用加载数据本地INFILE

    我在 Ubuntu 12 LTS 上运行 Mysql 5 5 我应该如何在 my cnf 中启用 LOAD DATA LOCAL INFILE 我已经尝试在配置中的各个位置添加 local infile 但我仍然收到 此 MySQL 版本不
  • Windows 窗体:进度栏无响应

    我有一个小应用程序来转换多种文件格式 其中一个主窗口窗体包含几个文本框 按钮等 我有另一个 文档 类 它处理所有实际的转换工作 我的窗体基本上迭代所有文件 并调用适当的 Document 方法来转换文件 然而 当这种情况发生时 表单会停止响
  • 从类访问私有模块变量

    我正在尝试理解 python 作用域规则 为此 我尝试从同一模块中的类访问 非常私有 变量 bar bar bar underscore bar double underscore def foo print bar print bar p