当前位置: 移动技术网 > IT编程>脚本编程>Python > Python中的动态属性与描述符

Python中的动态属性与描述符

2019年08月10日  | 移动技术网IT编程  | 我要评论

天水师范学院是几本,宝安碧海湾公园,南京南动车所塌方

动态属性与属性描述符

属性描述符是什么?

  在解释属性查找顺序之前我们需要了解python中的属性描述符,属性描述符作为其他类对象的属性而存在,实现了特殊方法中的get、set、delete中的一种即可称作属性描述符。

其中只实现了__get__()的称作非数据描述符,实现了__get__()和__set__()方法的称作数据描述符。

  • data.py
class data():
    def __get__(self, instance, owner):
        pass
    
    def __set__(self, instance, value):
        pass
    
    def __delete__(self, instance):
        pass
  • nodata.py
class nonedata():
    def __get__(self, instance, owner):
        pass

动态属性

  在实际项目的开发中我们有时候需要去将自己的逻辑(方法)变成属性来调用,也就是我们常说的@property动态属性。

  • propertytest.py
import numbers
class user:
    def __init__(self):
        pass
    @property
    def age (self):
        return self.__userage
    @age.setter
    def age(self,value):
        if isinstance(value,numbers.integral):
            self.__userage = value
        else:
            raise valueerror
if __name__ == '__main__':
    user = user()
    user.age = 30
    print(user.age)
  • 对用户信息的赋值中,我们需要对值进行判断是否合法,直接在初始化特殊方法中进行判断是无法实现的。因此需要引入动态属性,将判断和赋值在age方法中进行,同时添加@property装饰器,将方法转换为供我们调用的属性。当然我上述的代码合法性判断只写了整数判断,具体的读者可以自行实现。

属性描述符

  读到这,肯定很多人者都会有一个疑问,那属性描述符还有什么用呢?我们在设计user类的时候,肯定不只有age这一个属性,如果再加上其他信息属性,那么就会出现大量的@property修饰的方法在同一个类,这是不符合设计原则的,代码的分离性和可读性大大降低。这时候属性描述符就能起到很大的帮助了。

  • desc.py
class ageattr:
    def __get__(self, instance, owner):
        return self.__userage

    def __set__(self, instance, value):
        if isinstance(value,numbers.integral):
            self.__userage = value
        else:
            raise valueerror

    def __delete__(self, instance):
        pass

class user:
    age = ageattr()
    def __init__(self):
        pass


import numbers

if __name__ == '__main__':
    user = user()
    user.age =25
    print(user.age)
  • 将代码使用属性描述符重新构造后,user类中的代码大大减少,我们能更好地提高代码的分离性

关于属性的查找顺序请看这>

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网