Python类属性和实例属性

两种属性的语法

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中给变量赋值和申明变量并初始化在语法上时完全一样的,试图通过实例给类属性重新赋值时,会被认为给实例绑定了一个新的实例属性;但是当通过实例操作类属性时(操作这个概念包括直接获得类属性值,通过方法或索引获得类属性的值,通过索引和方法改变类属性的值),会试图寻找同名的实例属性,如果没有找到,则寻找类属性。

你可能感兴趣的:(Python类属性和实例属性)