技术图文: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/

往期活动

LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!

发布了573 篇原创文章 · 获赞 327 · 访问量 129万+

猜你喜欢

转载自blog.csdn.net/LSGO_MYP/article/details/103532903