del如何与对象属性交互?
我是新来的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?
粘性问题在这里一个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
,但如果您想要,可以是 ):
>>> 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
@ user6189我在Python中添加了一些关于类级别的变量。阅读[官方教程](https://docs.python.org/3/tutorial/classes.html)很有帮助。 Python类的定义非常简单,但它们的工作方式与Java类定义稍有不同。 –
@Aaron我不明白这与我的问题有甚么关系。你能详细说明吗? – user6189
这里给Python初学者的一个棘手问题是'abc'是一个*类变量*(即一个“静态”变量),当你做'c1.abc = 3'时,你*实例变量。当你做'del c1.abc'时,'del'适用于* instance *变量,因此现在调用'c1.abc'返回类变量。 –
@Aaron但这不是这里发生的事情。 –