python 属性描述符

属性描述符

属性描述符介绍

  • 属性描述符是一个强大的通用协议,它是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__
      
      

最后,有喜欢博主写的内容的伙伴可以收藏加关注哦!

猜你喜欢

转载自blog.csdn.net/weixin_44604586/article/details/106931088