打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
技术图文:Python属性装饰器详解

背景

我们在以前的一篇图文 Python基础 -- Task10. 类与对象 中介绍过利用property()方法既能保护类的封装特性,又能让开发者可以使用“对象.属性”的方式操作类属性。

class property([fget[, fset[, fdel[, doc]]]])

用于在新式类中返回属性值。
fget -- 获取属性值的函数
fset -- 设置属性值的函数
fdel -- 删除属性值函数
doc -- 属性描述信息

并在图文 Python魔法方法之属性访问详解 中详细介绍了property()方法的实现机理。

除了使用property()方法外,Python还提供了属性装饰器。通过这些属性装饰器,可以直接利用方法名来访问方法,不需要在方法名后添加一对“()”小括号。

@property
def 方法名(self)
    代码块

@方法名.setter
def 方法名(self, value):

    代码块

@方法名.deleter
def 方法名(self):
    代码块    

代码演示

1. Python属性装饰器举例

class People:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age if age > 0 else 0

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, age):
        if isinstance(age, int):
            self.__age = age if age > 0 else 0
        else:
            raise ValueError

    @age.deleter
    def age(self):
        print('删除年龄数据!')


obj = People('jack'18)
print(obj.age) # 获取值
obj.age = 19 # 重新赋值
print('obj.age:', obj.age)
del obj.age # 删除属性

# 18
# obj.age: 19
# 删除年龄数据!
  • @property装饰器

上例中的第一个age(self)方法,这样就使得该方法变成了age属性的getter方法。需要注意的是,如果类中只包含该方法,那么age属性将是一个只读属性。

  • @xxx.setter装饰器

上例中的第二个age(self, age)方法,这样就使得该方法变成了age属性的setter方法,提供赋值功能。

  • @xxx.delete装饰器

上例子中第三个age(self)方法,这样就使得该方法变成了age属性的deleter方法,用于删除功能。

2. 使用property()函数

class People:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age if age > 0 else 0

    def get_age(self):
        return self.__age

    def set_age(self, age):
        if isinstance(age, int):
            self.__age = age if age > 0 else 0
        else:
            raise ValueError

    def del_age(self):
        print("删除年龄数据!")

    age = property(get_age, set_age, del_age, "年龄")


obj = People('jack'18)
print(obj.age)
obj.age = 19
print('obj.age:', obj.age)
del obj.age

# 18
# obj.age: 19
# 删除年龄数据!

总结

本图文介绍了Python中三种属性装饰器,并通过案例演示了这三种属性装饰器的使用方法,并利用property()方法实现了相同的功能。今天就到这里吧!See You!


参考文献

  • http://c.biancheng.net/view/4561.html

  • http://www.liujiangblog.com/course/python/


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
python 面向对象全面详解
python的这些特殊方法你都用过哪些?一起使用后发现有这些规律
Python高级编程技巧
Python中的@property内部是怎么实现的?
Python 高级编程之面向切面编程 AOP(二)
如何使用三种不同的方式生成python源代码,提高开发效率?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服