装饰器property用法及使用它重构代码时的应用实例

简介:   我们知道装饰器可以将所需要的函数作为对象返回给需要用此函数处理的对象。而property装饰器则是将一个函数或者方法成为一个属性以供使用。@property这种语法糖形式简化了装饰器的使用。 ### 二、引导  在面向对象类型的语言中访问修改类中的属性时通常会自己写set或者get函数,对输出结果进行修饰或者对输入进行合法化检查。然而python可以提供一种优美的更直观的方法就是使用装饰器@property。

### 一、装饰器
  我们知道装饰器可以将所需要的函数作为对象返回给需要用此函数处理的对象。而property装饰器则是将一个函数或者方法成为一个属性以供使用。@property这种语法糖形式简化了装饰器的使用。
### 二、引导
  在面向对象类型的语言中访问修改类中的属性时通常会自己写set或者get函数,对输出结果进行修饰或者对输入进行合法化检查。然而python可以提供一种优美的更直观的方法就是使用装饰器@property。

三、用法

实例:对属性进行正整数检查

class Inter:

    def __init__(self, value=0):
        self.inter = value

    def get_int(self):
        """
        将输出转化为字符串
        :return:
        """

        return str(self.inter)

    def set_int(self, value):
        if(value < 0) | (not isinstance(value, int)):
            raise ValueError('inter is error.')
        self.inter = value
        return self.inter

a = Inter()
a.set_int(3)
print(a.get_int())

  这样写是不是很不直观,所以我们采用property来写,并使用语法糖@property

class Inter:

    def __init__(self, value=0):
        self._inter = value

    @property
    def inter(self):
        """
        将输出转化为字符串
        :return:
        """

        return str(self._inter)

    @inter.setter
    def inter(self, value):
        if(value < 0) | (not isinstance(value, int)):
            raise ValueError('inter is error.')
        self._inter = value
        return self._inter

a = Inter()
a.inter = 3
print(a.inter)

四、重构代码的应用实例

  很久以前,Python程序员Tom写了一个代表金钱的类。他的实现的形式下面这样:

# 首个版本
class Money:
    def __init__(self, dollars, cents):
        self.dollars = dollars
        self.cents = cents

  这个类后来被打包到一个公共库里,慢慢地被不同的应用使用。公司另一个团队中的Bob是这样使用Money类的:

# 创建一个money对象
money = Money(34, 1)
print("{} dollars and {} cents.".format(money.dollars, money.cents))
# 修改money类的属性
money.dollars = 23
money.cents = 2
print("{} dollars and {} cents.".format(money.dollars, money.cents))

结果:
    34 dollars and 1 cents.
    23 dollars and 2 cents.

  一段时间后,公司业务变化原来的money只需要记录美分。pm找到开发,然而Tom却离职了,只能找到刚接手的Jerry。Jerry看过代码后说没问题,他是这样改的:

# 第二个版本
class Money:
    def __init__(self, dollars, cents):
        self.total_cents = dollars * 100 + cents

  改完后Jerry突然想到:如果很多业务部门引用Money类的话,每一处都必须要调整。幸好他是一个机智的少年,知道装饰器property的使用方法,马上做出如下的修改。

# 最终版本
class Money:
    def __init__(self, dollars, cents):
        self.total_cents = dollars * 100 + cents

    # dollars使用property装饰器的输入、输出
    @property
    def dollars(self):
        return self.total_cents // 100;
    @dollars.setter
    def dollars(self, new_dollars):
        self.total_cents = 100 * new_dollars + self.cents

    # cents使用property装饰器的输入、输出
    @property
    def cents(self):
        return self.total_cents % 100;
    @cents.setter
    def cents(self, new_cents):
        self.total_cents = 100 * self.dollars + new_cents

上面代码使用@property装饰器定义了dollars、cents属性(相当于get函数),还利用@dollars.setter、@cents.setter创建了一个setter(相当于set函数)。

Jerry对刚才自己机智的行为很是满意,奖励自己晚餐一个大大的鸡腿,而另一个团队Bob并没有感觉到任何的变化。

目录
相关文章
|
存储 缓存 Java
优化Java代码中的内存使用:使用WeakHashMap解决内存泄漏问题
在Java应用程序中,内存泄漏是一个常见的问题,尤其是在处理大量对象时。本文将介绍如何使用WeakHashMap数据结构来解决内存泄漏问题,通过示例代码演示其在实际项目中的应用,从而提高Java代码的性能和可靠性。
|
JSON Linux 开发工具
「译文」给讨厌 YAML 的人的 10 个写 YAML 的建议
「译文」给讨厌 YAML 的人的 10 个写 YAML 的建议
|
存储 测试技术 API
魔搭Agent体验升级!支持编辑已发布的Agent、新增tool说明书等
魔搭Agent作为开源版GPTs,可以零代码DIY一个具备丰富功能的chat bot,今天上线了一个新版本优化了相关体验,来看!
|
存储 API Android开发
请解释Android的推送服务,如Firebase Cloud Messaging(FCM)。
请解释Android的推送服务,如Firebase Cloud Messaging(FCM)。
612 0
|
安全 Linux 网络安全
组网神器WireGuard安装与配置教程(超详细)
组网神器WireGuard安装与配置教程(超详细)
39332 2
|
安全 Go 数据安全/隐私保护
Flutter开发笔记:Flutter路由技术
Flutter开发笔记:Flutter路由技术
1454 0
|
Ubuntu 网络协议 Linux
在Linux中,发行版和内核有什么区别?
在Linux中,发行版和内核有什么区别?
|
C++
基于C++的简易文件管理系统设计与实现
基于C++的简易文件管理系统设计与实现
599 6
|
安全 算法 程序员
在go语言中使用泛型和反射
【7月更文挑战第8天】本文介绍go支持泛型后,提升了代码复用,如操作切片、映射、通道的函数,以及自定义数据结构。 泛型适用于通用数据结构和函数,减少接口使用和类型断言。
301 1
在go语言中使用泛型和反射
|
人工智能 搜索推荐 机器人
AppFlow无代码轻松搭建模型Agent
使用钉钉,现在每个人都能轻松创建自己的AI助手。通过结合各种插件,如天气、机票查询和地图,你可以定制个性化的工作助手。利用AppFlow,即使没有编程经验也能搭建AI Agent。步骤包括:1) 在钉钉开放平台创建应用,获取凭证;2) 在钉钉卡片平台创建AI卡片实例;3) 在AppFlow配置连接流,添加所需插件;4) 创建钉钉机器人,设置HTTP消息接收并关联AppFlow的Webhook。完成这些步骤后,你就可以在钉钉群中与你的AI助手互动了。
52246 13