python:类属性和实例属性

2024-04-13

我是 python 新手,了解到类属性就像 C++ 中的静态数据成员。但是,在尝试以下代码后我感到困惑:

>>> class Foo:
...     a=1
... 
>>> f1=Foo();
>>> f2=Foo()
>>> f1.a
1
>>> f1.a=5
>>> f1.a
5
>>> f2.a
1

f2.a 不应该也等于 5 吗?

如果 a 被定义为列表而不是整数,则预期行为为:

>>> class Foo:
...     a=[]
... 
>>> f1=Foo();
>>> f2=Foo()
>>> f1.a
[]
>>> f1.a.append(5)
>>> f1.a
[5]
>>> f2.a
[5]

我在看Python:类属性和实例属性之间的区别 https://stackoverflow.com/questions/207000/python-difference-between-class-and-instance-attributes,但它没有回答我的问题。

谁能解释为什么会有这样的差异?谢谢


Python类属性和对象属性是分开存储的字典 http://docs.python.org/tutorial/datastructures.html#dictionaries。对于对象f1,这些可以分别通过以下方式访问:f1.__class__.__dict__ and f1.__dict__。执行中print f1.__class__ is Foo将输出True.

当你引用一个对象的属性时,Python 首先尝试在对象字典中查找它。如果在那里找不到它,它会检查类字典(依此类推继承层次结构)。

当您分配给f1.a,您正在向对象字典添加一个条目f1。后续查找f1.a将找到该条目。查找f2.a仍然会找到类属性——类属性字典中的条目。

你可以导致的价值f1.a恢复到1通过删除它:

del f1.a

这将删除条目a在对象字典中f1,后续查找将继续到类字典。所以,后来,print f1.a将输出1。

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

python:类属性和实例属性 的相关文章

随机推荐

  • .NET RIA 服务与 MVC 风格存储库?

    我有一个包含多个项目的解决方案 包括两个共享位于外部程序集中 也在同一解决方案中 的存储库和模型的 asp net mvc 项目 本质上 Core 存储库 楷模 国内 Web 基本MVC站点 引用核心项目 国际网 基本MVC站点 引用核心项
  • 使用 NativeMessaging 进行边缘扩展

    我有一个具有本机消息传递支持的边缘扩展 它与系统中运行的 uwp 应用程序进行通信 是否必须将扩展打包到 uwp 应用程序的 appx 文件夹中 如果没有 那么我们如何将扩展上传到边缘扩展存储中 我遵循 secureInput 示例 htt
  • 快速向 SQL Server 插入 200 万行

    我必须从文本文件中插入大约 200 万行 通过插入 我必须创建一些主表 将如此大的数据集插入 SQL Server 的最佳且快速的方法是什么 我认为最好读取 DataSet 中文本文件的数据 试用SQL批量复制 从 C 应用程序批量插入 S
  • GSON反序列化:如何知道对象?

    我尝试使用 gson 库来反序列化发送给我的对象流 在我见过的所有示例中 当调用 fromJson 方法时 我们已经知道我们期望拥有什么类型的对象 就我而言 我收到不同对象的流 我想知道在反序列化对象之前了解对象类的最佳方法 A B B1
  • Android 自定义通知布局与 RemoteViews

    我正在尝试使用此为我的 Android 应用程序创建自定义通知post https stackoverflow com questions 18367631 change notification layout 我偶然发现了一个我在过去 2
  • 使用 LIMIT 时获取总行数? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 offset limit 查找 mySQL 查询中的结果总数 https stackoverflow com questions 5928611 find total number of res
  • JAX-RS自定义ExceptionMapper不拦截RuntimeException

    我想包裹底层RuntimeExceptions自定义 json 格式 使得 servlet 容器不会将堆栈跟踪转储到客户端 我关注这个问题 使用 XML 或 JSON 的 JAX RS Jersey 自定义异常 https stackove
  • 强制 MySQL 在连接上使用两个索引

    我试图强制 MySQL 使用两个索引 我正在加入一个表 我想利用两个索引之间的交叉 具体术语是 Using intersect 这里是 MySQL 文档的链接 http dev mysql com doc refman 5 0 en ind
  • Xamarin 表单:从 Xamarin Forms 应用程序启动 IOS 应用程序时出现问题(输入 URL 无效)

    我正在尝试从我的 xamarin forms ios 应用程序打开一个 ios 应用程序 我已经提到过this https stackoverflow com questions 43944283 launch another ios ap
  • 使用 NuGet 安装 NHibernate 3.2

    我是 NHibernate 的新手 一直在尝试使用 NuGet 来启动和运行它 Fluent NHibernate 和 NProf 读完这篇文章后 http gurustop net blog 2011 03 13 nhibernate 3
  • SVGforeignObject 无法在任何浏览器上显示,为什么?

    我在 SVG 元素中有一个foreignObject 所有其他元素都会显示 但foreignObject 及其内容是不可见的 在 Chrome Firefox 和 Edge 中进行了测试 结果均相同 这是代码
  • 尝试使用 PHP 通过 HMAC-SHA1 进行数字签名

    我正在尝试设置一些 Google Maps Premier API 操作 为此 我需要对我的网址进行签名以进行身份 验证 如果您查看签名示例 可以看到一些 Python C 和 Java 代码向您展示如何通过 HMAC SHA1 进行签名
  • IEnumerable vs IReadonlyCollection vs ReadonlyCollection 用于公开列表成员

    我花了好几个小时思考曝光名单成员的问题 在与我类似的问题中 乔恩 斯基特 Jon Skeet 给出了很好的答案 请随意看看 ReadOnlyCollection 或 IEnumerable 用于公开成员集合 https stackoverf
  • 这个值应该被释放吗?

    我在 IOS 模拟器中遇到了 segfault 11 内存访问错误 但当我在下面的代码中注释掉该版本时 该错误消失了 get get the question number NSString text attributeDict value
  • 减少knitr块中命令和输出之间的空间

    我在用着knitr with LaTeX并且代码块回显的命令与输出的开头之间似乎有很多空间 LaTeX 代码如下所示 begin knitrout scriptsize definecolor shadecolor rgb 1 1 1 co
  • .net5.0 PRISM WPF应用程序,如何使用 Microsoft.Exensions.Logging 以 Serilog 作为提供程序?

    我有一个 PRISM 8 1 97 WPF 应用程序在带有 Unity 容器的 net5 0 上运行 我想做的是将 Serilog 指定为我的日志记录提供程序 但注入通常的Microsoft Extensions Logging通过我的 D
  • django更新视图不​​显示日期输入(以前的)值

    当我进入更新页面时 除日期输入 截止日期和提醒 外 所有先前的值都会显示 我该如何修复它 起初 我没有将 TaskCreationForm 用于 TaskUpdateView 因为考虑到 django 会自动处理它 但后来日期输入变成了普通
  • 为什么 HTML5 中的导航栏采用列表形式?

    自从我开始使用 HTML CSS 等以来 我一直注意到的一件事是 导航栏几乎总是以列表的形式呈现 有以下几种变体 HTML ul li a href link1 html link 1 a li li a href link2 html l
  • ContextMenu 与 jQuery FullCalendar 集成

    我用的是亚当 肖的FullCalendar与 jQuery 一起控制 我想为事件和日期添加上下文菜单 我能够通过使用来实现这一点Martin Wendt 的上下文菜单控件 http wwwendt de tech demo jquery c
  • python:类属性和实例属性

    我是 python 新手 了解到类属性就像 C 中的静态数据成员 但是 在尝试以下代码后我感到困惑 gt gt gt class Foo a 1 gt gt gt f1 Foo gt gt gt f2 Foo gt gt gt f1 a 1