Python学习之装饰器(二)
装饰器可以帮助您编写更少、更简单的代码来实现复杂的逻辑并在任何地方重用它。
更重要的是,有许多很棒的内置 Python 装饰器使我们的生活变得更加轻松,因为我们只需使用一行代码就可以为现有的函数或类添加复杂的功能。
1. @property:特性装饰器
🔊:主要是作用是把类中的一个方法变为类中的一个属性,以支持实例访问,被修饰的特性方法,内部可以实现处理逻辑,但对外提供统一的调用方式,返回的是一个property属性
import math #🌾:定义类 class Circle: def __init__(self,radius): #圆的半径radius self.radius=radius @property def area(self): return math.pi * self.radius**2 #计算面积 @property def perimeter(self): return 2*math.pi*self.radius #计算周长 #🌾:通过实例访问到类中属性 circle=Circle(10) print(circle.radius) #输出:10 #🌾:通过@property装饰后的方法也可以像访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值; #🍯:就是说通过 @property 修饰后的函数,可以像属性一个,调用。类似于其它语言中的getter语法 print(circle.area) #输出:314.1592653589793 print(circle.perimeter) #输出:62.83185307179586
一个property对象还具有setter、deleter 可用作装饰器
- setter: setter 方法用于设置属性的值。它的命名格式为
<property_name>.setter
。通过在@<property_name>.setter
装饰器下定义一个方法,可以将该方法转化为属性的 setter 方法。 - deleter:deleter 方法用于删除属性。它的命名格式为
<property_name>.deleter
。通过在@<property_name>.deleter
装饰器下定义一个方法,可以将该方法转化为属性的 deleter 方法。 - getter: getter 方法用于获取属性的值。它的命名需要与
@property
装饰器的名称相同。在类中定义了@property
装饰器的方法就是 getter 方法(默认方法)。
#🌾:定义类 class C: def __init__(self): self._x = None #获取属性信息 @property def x(self): return self._x #设置属性值 @x.setter def x(self, value): self._x = value #删除属性值 @x.deleter def x(self): del self._x #🌾:实例化类 c = C() #🌾:为属性进行赋值,setter方法 c.x=100 #🌾:输出属性值,getter 方法 print(c.x) #输出:100 #🌾:删除属性,del 方法 del c.x
使用property:在设置属性时,可以对值对进检查,设置发生时,可以 修改设置的值,获取属性时,可以动态地计算值
2. @classmethod:类方法装饰器
🔊:修饰的方法不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等
#🌾:定义类 class Car(object): #定义类属性 car = "audi" # cls 接收的是当前类,类在使用时会将自身传入到类方法的第一个参数 @classmethod def value(cls, category): # 可定义多个参数,但第一个参数为类本身 print('这是类本身:', cls) # 如果子类调用,则传入的是子类 print("%s car of %s" % (category, cls.car)) class BMW(Car): car = "BMW" class Benz(Car): car = "Benz" #🌾 自身调用 Car.value("ALL") #🌾 通过实例调用 bmw = BMW() bmw.value("Normal") # 由于第一个参数为类本身,调用时传入的参数对应的是category #🌾 通过类名直接调用类方法 不需要实例化可以执行调用类方法 Benz.value("SUV")
输出:
这是类本身: <class '__main__.Car'> ALL car of audi
这是类本身: <class '__main__.BMW'> Normal car of BMW
这是类本身: <class '__main__.Benz'> SUV car of Benz
3. @staticmethod:静态方法装饰器
将类中的方法装饰为静态方法,即类不需要创建实例的情况下,可以通过类名直接引用
🔊:静态方法不需要传递隐性的第一参数,静态方法的本质类型就是一个函数
一个静态方法可以直接通过类进行调用,也可以通过实例进行调用,但建议使用类进行调用
#导入第三方模块 import time
#🌾:定义类 class Date: #初始化方法 def __init__(self,year,month,day): self.year=year self.month=month self.day=day
#1.用Date.now()的形式去产生实例,该实例用的是当前时间 def now(): t=time.localtime() # 获取结构化的时间格式 return Date(t.tm_year,t.tm_mon,t.tm_mday) # 新建实例并且返回
#2.用Date.tomorrow()的形式去产生实例,该实例用的是明天的时间 @staticmethod def tomorrow(): t=time.localtime(time.time()+86400) return Date(t.tm_year,t.tm_mon,t.tm_mday) #🌾:调用 a=Date('1987',11,27) # 自己定义时间 print(a.year,a.month,a.day) # 输出:1987 11 27 b=Date.now() # 采用当前时间 print(b.year,b.month,b.day) # 输出:2024 12 9 c=Date.tomorrow() # 采用明天的时间 print(c.year,c.month,c.day) # 输出:2024 12 10