您的位置:首页 > 其它

关于类属性和实例属性

2008-12-03 11:16 148 查看
Python果然是一个优雅的语言,就连他的OOP都做的那么的优雅,呵呵不赞美了,说点实在的,关于类的属性和实例的属性,在Python中应用一定要小心和谨慎,如果没有明确的目的,不要去修改类属性。

类中定义的属性,相当于静态变量,用类名加句点访问和用实例加句点访问,都能获取值。但是如果进行计算的话,用类名访问是可以的,而用实例访问则是给实例增加了一个同名属性。看例子:

>>> class Foo(object):
... x = 1.5
...
>>> foo = Foo()
>>> foo.x
1.5
>>> foo.x = 1.7 # try to update class attr 试着更新类属性
>>> foo.x # looks good so far... 现在看起来还不错
1.7
>>> Foo.x # nope, just created a new inst attr 呵呵,没有变,只是创建了一个新的实
例属性
1.5

此时,删除实例的属性 del foo.x。"遮蔽"的类属性又出现了

>>> del foo.x # delete instance attribute 删除实例属性
>>> foo.x # can now access class attr again 又可以访问到类属性

所以,给一个与类属性同名的实例属性赋值,我们会有效地“隐藏”类属性,但一旦我们删除
了这个实例属性,类属性又重见天日

但...在类属性可变的情况下,一切都不同了:
>>> class Foo(object):
... x = {2003: 'poe2'}
...
>>> foo = Foo()
>>> foo.x
{2003: 'poe2'}
>>> foo.x[2004] = 'valid path'
>>> foo.x
{2003: 'poe2', 2004: 'valid path'}
>>> Foo.x # it works!!! 生效了
{2003: 'poe2', 2004: 'valid path'}
>>> del foo.x # no shadow so cannot delete 没有遮蔽所以不能删除掉
Traceback (most recent call last): File "<stdin>", line 1, in ?
del foo.x
AttributeError: x
>>>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: