del如何与对象属性交互?

时间:2017-04-10 18:48:11

标签: python memory-management attributes

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

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比较?

1 个答案:

答案 0 :(得分:3)

这里对Python初学者的棘手问题是abc是一个类变量(即"静态"变量),当你执行c1.abc = 3时,你使用实例变量来隐藏类变量。执行del c1.abcdel适用于实例变量,因此现在调用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.<someattribute>始终删除实例属性。如果应用于实例,它不会删除类级属性,而是必须将它应用于类!

在Python中,在类块中编写的所有内容总是在类级别。从这个意义上说,它比Java更简单。要定义实例变量,需要使用传递给该方法的第一个参数(通过约定)直接分配给实例,超出方法(c1.abc = 3)或方法内部(通过约定如果您愿意,可以调用self,但可以是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