属性描述符
属性描述符介绍
- 属性描述符是一个强大的通用协议,它是properties, methods, static methods, class methods 和super()的调用原理。
属性描述符协议
- 属性描述符是实现特定协议的类,只要类里有
__get__()
、__set__()
、和__delete__()
方法的其中一个,就称为类为描述符,它能实现对多个属性运用相同存取逻辑的一种方式 - 示例代码
class IntDemo(object): def __set__(self, instance, value): print("你给属性值设定%s" % value) def __get__(self, instance, owner): print("你访问了的属性") def __delete__(self, instance): pass class User(object): year = IntDemo() user = User() user.year # 你访问了的属性 user.year = 30 # 你给属性值设定30
- 使用属性类型创建描述符
除了使用类当作一个属性描述符,我们还可以使用 property(),就是可以轻松地为任意属性创建可用的描述符。创建 property() 的语法是 property(fget=None, fset=None, fdel=None, doc=None) - 注意
- 如果一个类同时定义了
__get__
方法和__set__
方法,则称之为数据描述符 - 如果只有
__get__
方法,则称之为非数据描述符
- 如果一个类同时定义了
描述符查找顺序
- 当为数据描述符时, __get__优先级高于__dict__
- 示例代码
class IntDemo(object): def __set__(self, instance, value): self.values = value def __get__(self, instance, owner): return self.values def __delete__(self, instance): pass class User(object): year = IntDemo() user = User() user.year = 30 # 你给属性值设定30 user.__dict__['year'] = 18 print(user.year) # 30,优先访问__get__
- 示例代码
- 当为非数据描述符时,__dict__优先级高于__get__
- 示例代码
class IntDemo(object): def __get__(self, instance, owner): print('__get__') class User(object): year = IntDemo() user = User() user.year = 30 # 你给属性值设定30 user.__dict__['year'] = 18 print(user.year) # 18,优先访问__dict__
- 示例代码
最后,有喜欢博主写的内容的伙伴可以收藏加关注哦!