关于类属性和实例属性
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
>>>
类中定义的属性,相当于静态变量,用类名加句点访问和用实例加句点访问,都能获取值。但是如果进行计算的话,用类名访问是可以的,而用实例访问则是给实例增加了一个同名属性。看例子:
>>> 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
>>>
相关文章推荐
- 关于Python类属性与实例属性的讨论
- 关于Button控件的CommandName属性用法的一个实例
- 关于js中类的静态属性和实例属性的理解
- Intent filter 关于Action、Category属性详解---附带实例源码
- 关于C# Windows Forms 怎样通过用窗体类的this.Handle属性得到的IntPtr在别处的类中将此IntPtr还原为刚刚那个窗体类的实例,即(this).
- 关于Python类属性与实例属性的讨论
- 关于Release模式下优化属性导致异常的处理实例
- 错误2:关于实例属性和类属性之间的关系
- Intent filter 关于Action、Category属性详解---附带实例源码
- 关于RegExp对象实例的lastIndex属性的一些整理
- C#关于类的只读只写属性实例分析
- 关于enum ,调用webservice,用户控件与主页面之间的交互,datsource属性,net面试题,反射类生成sql语句,URl重写一个小实例
- 关于实例变量和属性——之二
- 关于Python类属性与实例属性的讨论
- 关于Python类属性与实例属性的讨论
- 关于Javascript中通过实例对象修改原型对象属性值的问题
- 关于Python类属性与实例属性的讨论
- 关于网站增加qq客服的开发,iwebshop框架实例
- 关于uitableviewcell的accessoryType属性
- 【基础】关于数组与多态不能合用的一个实例