Python 装饰器

综述

装饰器的定义

装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计。有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已存在的对象添加额外的功能。

内置装饰器(decorator)

staticmethod

classmethod

property

如果我们想要规范类的属性访问,有两种方式可以使用:1.数据描述符 2.property装饰器。

@property装饰器就是把一个方法变成属性调用的。

例子:

class Person(object):
    def __init__(self, name, age):
        # 属性直接对外暴露
        # self.age = age
        # 限制访问
        self.__age = age
        self.__name = name
        # self.__name = name

    def getAge(self):
        return self.__age

    def setAge(self, age):
        if age < 0:
            age = 0
        self.__age = age

    # 通过@property和@age.setter改变原来的get/set方法
    # 方法名为受限制的变量去掉双下划线
    # 相当于get方法
    @property
    def age(self):
        return self.__age

    # 相当于set的方法
    @age.setter  # 去掉下划线.setter
    def age(self, age):
        if age < 0:
            age = 0
        self.__age = age

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, name):
        self.__name = name


per = Person("lili", 18)
# 属性直接对外暴露
# 不安全,没有数据的过滤
# per.age = -10
# print(per.age)

# 使用限制访问,需要自己写set和get的方法才能访问
# 劣势:麻烦,代码不直观
# 思考问题:如果我就想使用对象"."的方式访问对象的私有属性,怎么办?
# per.setAge(15)
# print(per.getAge())

# property:可以让你对受限制访问的属性使用"."语法
per.age = 80  # 相当于调用setAge
print(per.age)  # 相当于调用getAge

print(per.name)
输出:
80
lili

总结

  1. 装饰器(decorator)可以给函数动态加上功能,对于类的方法,装饰器一样起作用,python内置的@property装饰器就是负责把一个方法变成属性调用的。
  2. @property的实现比较复杂,我们先考虑如何使用,把一个getter方法变成属性,只需要加上@property就可以了,此时@property本身又创建了另一个装饰器@属性setter,负责把一个setter方法变成属性赋值.
  3. @property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值