我是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比较?
答案 0 :(得分:3)
这里对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.<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