Python类属性和实例属性
2018-04-27 本文已影响0人
Bug之王
两种属性的语法
class WhiteCat(Animal):
# 类属性
color = 'white'
type = 'cat'
def __init__(self, name):
# 给刚生成的实例绑定属性
self.name = name
myWhiteCat = WhiteCat('mimi')
# 给实例绑定属性
myWhiteCat.sex = 'girl'
类实例的访问
类实例可以通过类访问也可以通过实例访问
>>> WhiteCat.color
'white'
>>> myWhiteCat.color
'white'
赋值操作是需要特别注意的
>>> WhiteCat.color = 'red'
>>> WhiteCat.color
'red'
>>> myWhiteCat.color = 'blue'
>>> WhiteCat.color
'red'
>>> myWhiteCat.color
'blue
可以发现,当我们试图通过实例给类属性赋值时,实际上给实例绑定了一个和类属性同名的实例属性。
当类属性是可变对象时,情况好像有不一样
>>> class WhiteCat(object):
... describle = {'type': 'cat', 'color': 'white'}
...
>>> myCat = WhiteCat()
>>> myCat .describle['color'] = 'red'
>>> WhiteCat.describle
{'type': 'cat', 'color': 'red'}
可以发现通过实例改变类属性时成功地改变了。
Python中给变量赋值和申明变量并初始化在语法上时完全一样的,试图通过实例给类属性重新赋值时,会被认为给实例绑定了一个新的实例属性;但是当通过实例操作类属性时(操作这个概念包括直接获得类属性值,通过方法或索引获得类属性的值,通过索引和方法改变类属性的值),会试图寻找同名的实例属性,如果没有找到,则寻找类属性。