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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 实例属性访问时,先搜索实例命名空间内,没有的话就搜索类中的,不行就继续搜索继承树种的基类
    __XY__阅读 238评论 0 0
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,661评论 8 265
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,906评论 1 10
  • 大理,对我而言,它最吸引人的地方是它的安静,它的自然。不同于其他旅游城市的喧闹和商业化,在才村、在喜洲,我开始渐渐...
    ShayleeLi阅读 189评论 0 0