装饰器
常见的三个内置装饰器
@staticmethond
:静态方法
- 与成员方法的区别是没有
self
参数,并且可以在类不进行实例化的情况下调用。具体使用方法查看“Python基础学习笔记”中的“静态方法”。
@classmethon
:类方法
- 与成员方法的区别在于所接受到的第一个参数不是
self
对象的指针,而是cls
(当前类的具体类型)。具体使用方法查看“Python基础学习笔记”中的“类方法”。
@property
:属性方法
- 将一个类的对象方法转变成一个类的类属性,具体看下面的“
property
属性”。
property属性
- 介绍:
property
属性就是负责把一个方法当作属性进行使用,这样做可以简化代码使用。 - 问题:设置属性有两种方式:
- 一个是“
对象.属性
”的方式,这种方式直观,但修改属性的时候不能对操作设置限制,容易产生异常; - 另一个是“
对象.方法()
”的 方式,这种方式操作属性很安全,但是不直观。
- 解决:
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
编程即面向切面编程。 - 意义
- 将业务实现和其他细节隔离开;
- 切面就是业务实现
- 其他相关细节就是关注点
- 比如计时、记录日志、事务处理