2017-04-10 54 views
0

我是新来的Python,看到这个代码片段:del如何与对象属性交互?

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

@Aaron我不明白这与我的问题有甚么关系。你能详细说明吗? – user6189

+2

这里给Python初学者的一个棘手问题是'abc'是一个*类变量*(即一个“静态”变量),当你做'c1.abc = 3'时,你*实例变量。当你做'del c1.abc'时,'del'适用于* instance *变量,因此现在调用'c1.abc'返回类变量。 –

+0

@Aaron但这不是这里发生的事情。 –

回答

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,但如果您想要,可以是 ):

>>> 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 
+0

非常感谢!这清除了很多东西! – user6189

+0

@ user6189我在Python中添加了一些关于类级别的变量。阅读[官方教程](https://docs.python.org/3/tutorial/classes.html)很有帮助。 Python类的定义非常简单,但它们的工作方式与Java类定义稍有不同。 –