【问题标题】:How does del interact with object attributes? [duplicate]del 如何与对象属性交互? [复制]
【发布时间】:2017-09-05 22:42:30
【问题描述】:

我是 Python 新手,看到了这段代码 sn-p:

class C:
    abc = 2

c1 = C()
print c1.abc

c1.abc = 3
print c1.abc

del c1.abc
print c1.abc

我理解为什么第一个和第二个打印语句分别打印 2 和 3。但是,我有 Java 背景,我不明白“del c1.abc”行中发生了什么以及为什么最后一个打印语句打印 2 和不是某种错误。有人可以解释吗?如果可能的话,通过与 Java 进行比较?

【问题讨论】:

  • @Aaron 我不明白这与我的问题有什么关系。你能详细说明一下吗?
  • 这里对于 Python 初学者的棘手问题是 abc 是一个 类变量(即“静态”变量),而当您使用 c1.abc = 3 时,您shadow 带有实例变量的类变量。当您执行del c1.abc 时,del 将应用于 instance 变量,因此现在调用 c1.abc 返回类变量。
  • @Aaron 但这不是这里发生的事情。
  • @juanpa.arrivillaga Tha 正是我一直在寻找的答案!谢谢!您可以将其复制到实际答案吗?然后我可以投票并接受:)
  • @juanpa.arrivillaga 是的,我会删除我的评论.. 你的更相关

标签: python memory-management attributes


【解决方案1】:

对于 Python 初学者来说,棘手的问题是 abc 是一个类变量(即“静态”变量),而当你这样做 c1.abc = 3 时,用实例变量隐藏类变量。当您执行del c1.abc 时,del 适用于实例变量,因此调用c1.abc 现在返回类变量。

下面的交互式会话应该可以解决一些问题:

>>> class C:
...   abc = 2
...
>>> c1 = C()
>>> c2 = C()
>>> c1.abc = 3
>>> c1.abc
3
>>> c2.abc
2
>>> C.abc # class "static" variable
2
>>> del c1.abc
>>> c1.abc
2
>>> c2.abc
2
>>> C.abc
2
>>> del c2.abc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: C instance has no attribute 'abc'
>>> del C.abc
>>> c1.abc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: C instance has no attribute 'abc'
>>>

del.&lt;someattribute&gt; 总是删除 instance 属性。如果应用于实例,它不会删除类级别的属性,而是必须将其应用于类!

在 Python 中,编写在类块中的所有内容总是在类级别。从这个意义上说,它比 Java 更简单。要定义实例变量,您需要直接分配给实例,在方法之外 (c1.abc = 3) 或在方法内部,使用传递给该方法的第一个参数(通过 convention 这称为 @ 987654330@,但如果你愿意,也可以是banana):

>>> class C:
...    def some_method(banana, x): # by convention you should use `self` instead of `banana`
...         banana.x = x
...
>>> c = C()
>>> c.x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: C instance has no attribute 'x'
>>> c.some_method(5)
>>> c.x
5

【讨论】:

  • 非常感谢!这清除了很多事情!
  • @user6189 我在 Python 中添加了一些关于类级别变量的内容。阅读official tutorial 会很有帮助。 Python 类定义非常简单,但它们的工作方式与 Java 类定义略有不同。
猜你喜欢
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 2012-03-10
  • 1970-01-01
相关资源
最近更新 更多