装饰器

常见的三个内置装饰器

@staticmethond:静态方法
  • 与成员方法的区别是没有self参数,并且可以在类不进行实例化的情况下调用。具体使用方法查看“Python基础学习笔记”中的“静态方法”。
@classmethon:类方法
  • 与成员方法的区别在于所接受到的第一个参数不是self对象的指针,而是cls(当前类的具体类型)。具体使用方法查看“Python基础学习笔记”中的“类方法”。
@property:属性方法
  • 将一个类的对象方法转变成一个类的类属性,具体看下面的“property属性”。

property属性

  • 介绍property属性就是负责把一个方法当作属性进行使用,这样做可以简化代码使用。
  • 问题:设置属性有两种方式:
  1. 一个是“对象.属性”的方式,这种方式直观,但修改属性的时候不能对操作设置限制,容易产生异常;
  2. 另一个是“对象.方法()”的 方式,这种方式操作属性很安全,但是不直观。
  • 解决property可以把方法当属性使用,也就同时具备了直观性和安全性。

装饰器方式

  • 注意
  • @property表示当获取属性时,会执行下面修饰的方法。及一般放在get方法上面;
  • @方法名.setter表示但设置属性时会执行下面修饰的方法;
  • @property”修饰的方法一定要在“@方法名.setter”修饰的方法的前面定义。
  • @property修饰的方法名与@方法名.setter修饰的方法名与setter前的方法名一定要相同
class BXTurtle(object):
    def __init__(self, age):
        self.age = age
    
    @property
    def g_s_age(self):
        return self.age
    
    @g_s_age.setter
    def g_s_age(self, age):
        if age < 0:
            print("你输入有误!")
        else:
            self.age = age
bx_turtle = BXTurtle(1)
bx_turtle.g_s_age = 122  // 设置年龄
print(bx_turtle.g_s_age)  // 获取年龄

类属性方式

  • 格式类属性 = property(获取值方法, 设置值方法)
  • 注意
  • property参数的位置不能调换,必须是先获取方法,然后是设置方法;
  • 类属性和对象属性的变量名字不要相同,因为对象既可以调用对象属性,也可以调用类属性,它该不知道要调用谁。
class BXTurtle(object):
    def __init__(self, age):
        self.age = age
    
    def get_age(self):
        return self.age
    
    def set_age(self, age):
        if age < 0:
            print("你输入有误!")
        else:
            self.age = age
    
    g_s_age = property(get_age, set_age)  # !!!

bx_turtle = BXTurtle(60)
print(bx_turtle.get_age())  // 原始方式
bx_turtle.g_s_age = 30      // 自动调用 设置属性的方法
print(bx_turtle.g_s_age)    // 自动调用 获取属性的方法

装饰器与AOP编程思想

  • AOP编程即面向切面编程。
  • 意义
  • 将业务实现和其他细节隔离开;
  • 切面就是业务实现
  • 其他相关细节就是关注点
  • 比如计时、记录日志、事务处理