参考:python类方法
1. @property 装饰器
通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对“()”小括号。既可以保护类的封装特性,又能让开发者可以使用 “对象.属性” 的方式操作操作类属性,除了使用 property() 函数,Python 还提供了 @property 装饰器。
例如,定义一个矩形类,并定义用 @property 修饰的方法操作类中的 area 私有属性,代码如下:
class Rect:
def __init__(self,area):
self.__area = area
@property
def area(self):
return self.__area
rect = Rect(30)
#直接通过方法名来访问 area 方法
print("矩形的面积是:",rect.area)
运行结果为:
矩形的面积是: 30
上面使用 @property 修饰了 area() 方法,这样就使得该方法变成了 area 属性的 getter 方法。(属性aera的getter方法,名字也叫aera才行)
需要注意的是,如果类中只包含该方法,那么 area 属性将是一个只读属性。也就是说,在使用 Rect 类时,无法对 area 属性重新赋值,即运行如下代码会报错:
rect.area = 90
print("修改后的面积:",rect.area)#如果函数名和属性名相同,会报该错误
运行结果为:
Traceback (most recent call last): File
“C:\Users\mengma\Desktop\1.py”, line 10, in
rect.area = 90 AttributeError: can’t set attribute
2. @setter装饰器
而要想实现修改 area 属性的值,还需要为 area 属性添加 setter 方法,就需要用到 setter 装饰器,例如,为 Rect 类中的 area 方法添加 setter 方法,代码如下:
@area.setter
def area(self, value):
self.__area = value
再次运行如下代码:
rect.area = 90
print("修改后的面积:",rect.area)
运行结果为:
修改后的面积: 90
这样,area 属性就有了 getter 和 setter 方法,该属性就变成了具有读写功能的属性。
3. @deleter装饰器
除此之外,还可以使用 deleter 装饰器来删除指定属性
例如,在 Rect 类中,给 area() 方法添加 deleter 方法,实现代码如下:
@area.deleter
def area(self):
self.__area = 0
然后运行如下代码:
del rect.area
print("删除后的area值为:",rect.area)
运行结果为:
删除后的area值为: 0
4. 修饰器/装饰器
案例:classmethod的用法举例
class B:
age = 10
def __init__(self, name):
self.name = name
@classmethod
def eat(cls): #普通函数
print(cls.age)
def sleep(self):
print(self)
b = B("小贱人") # 对应name属性
b.eat()
#运行结果为:10
5 案例
5.1 案例1
下面 timeit_decorator
装饰器的作用是——计算并打印被装饰函数的运行时间。
要使用它,可以按照以下步骤为要监控的函数添加装饰器。
使用示例:
-
将
timeit_decorator
应用于某个函数:- 使用
@timeit_decorator
装饰器来修饰你想要测量执行时间的函数。 - 当该函数被调用时,装饰器会计算并打印函数的运行时间。
- 使用
-
示例代码:
import time
# 定义装饰器
def timeit_decorator(func):
"""装饰器:用于计算函数运行时间"""
def wrapper(*args, **kwargs):
start_time = time.time() # 记录开始时间
result = func(*args, **kwargs) # 调用被装饰的函数
end_time = time.time() # 记录结束时间
print(f"{func.__name__} 执行时间: {end_time - start_time:.2f}秒") # 打印执行时间
return result
return wrapper
# 使用装饰器
@timeit_decorator
def example_function(n):
"""一个示例函数,模拟耗时操作"""
total = 0
for i in range(n):
total += i
time.sleep(0.01) # 模拟耗时操作
return total
# 调用函数
result = example_function(100) # 将会输出函数的运行时间
输出示例:
example_function 执行时间: 1.01秒
解释:
-
装饰器
@timeit_decorator
:- 通过
@timeit_decorator
装饰example_function
,会自动应用装饰器的逻辑。 - 运行该函数时,会先记录开始时间,运行完函数后记录结束时间,然后打印该函数的执行时间。
- 通过
-
函数运行时间的输出:
- 当
example_function
被调用时,装饰器会计算其运行时间并打印出来。
- 当
应用场景:
- 当你想监控某些函数的执行时间时,使用这个装饰器是非常方便的。你可以将它应用于任何函数,只需在函数定义前加上
@timeit_decorator
。
总结:
1. @property装饰器:修饰的函数,类内调用时函数不用带小括号——getter方法
2. @setter 装饰器:函数名和变量名相同,可以直接修改属性——seter方法。
3.语法
@property
def 方法名(self)
代码块
@area.setter
def area(self, value):
self.__area = value
@方法名.deleter
def 方法名(self):
代码块
参考链接:
[1] Python @property装饰器详解 2022.5
[2] Python装饰器functools.wraps(func)详解 2019.6