python学习记录——修饰符

本文详细介绍了Python中装饰器(@)的使用方法及其应用场景,包括如何通过装饰器修改函数行为。此外,还深入探讨了参数修饰符(*)与(**)的作用,即如何利用这两种修饰符来灵活处理可变数量的位置参数和关键字参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.函数修饰符(@)

@与其说是修饰不如说其是引用

def use(f):
    def test():
        print('this is use test')
        f()
    return test

@use
def usetest():
    print('Hello')

usetest()

# 输出:
# this is use test
# Hello

类似于如下应用:

def use(f):
     print('this is use test')
     f()

def usetest():
    print('Hello')

use(usetest)

2.参数修饰符(*)

参数带一个星号表示参数以元组(tuple)的形式导入:

def use(*arg):
    print(arg)

use(1,'2',[2,'3'])

# 输出:
# (1, '2', [2, '3'])

# use(a=1, 2)  TypeError: use() got an unexpected keyword argument 'a'

3.参数修饰符(**) 

双星号(**)将参数以字典的形式导入:

def use(**arg):
    print(arg)

use(a=1, b='2', c=[2, '3'])

# 输出:
# {'a': 1, 'b': '2', 'c': [2, '3']}

def use(*arg1, **arg2):
    print(arg1)
    print(arg2)

use(1, b='2', c=[2, '3'])

# 输出:
# (1,)
# {'b': '2', 'c': [2, '3']}

### 如何在 Python 中使用 Redis 实现缓存功能 Redis 是一种高效的键值存储系统,常被用作缓存层以提升应用性能。以下是关于如何通过 Python 使用 Redis 来实现缓存的具体方法。 #### 连接 Redis 数据库 要连接到 Redis 服务器,通常需要借助 `redis-py` 库。此库提供了简单易用的接口来与 Redis 进行交互[^1]。安装该库可通过 pip 安装命令完成: ```bash pip install redis ``` 建立连接时需指定主机名、端口号以及可选密码参数等基本信息: ```python import redis # 创建 Redis 连接对象 r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) ``` 此处设置了解码选项 (`decode_responses`) 将返回字符串而非字节串形式的数据[^2]。 #### 缓存数据的操作 对于基本的缓存操作而言,主要涉及两个方面——写入缓存和读取缓存。 ##### 存储数据至缓存 当希望保存某些计算结果或其他动态生成的内容以便后续快速访问时,可以利用如下方式将其存放到 Redis 当中: ```python def set_cache(key, value, ex=None): """ 设置缓存 """ r.set(name=key, value=value, ex=ex) set_cache('my_key', 'value_of_my_key', ex=3600) # 设定有效期为 1 小时 ``` 上述代码片段展示了如何向 Redis 添加一条记录,并支持定义其生存周期 (TTL),单位默认为秒数。 ##### 获取已存在的缓存项 如果之前已经设置了某个特定 key 的关联值,则可以直接调用 get 方法尝试检索它;如果没有找到对应条目或者超出了设定时限,则应重新加载原始资源并将新版本更新回缓存之中: ```python def get_cache(key): """ 获取缓存 """ cached_value = r.get(key) return cached_value if cached_value is not None else False result = get_cache('my_key') if result: print(f'From Cache: {result}') else: actual_data = fetch_actual_data() # 假设有这样一个获取真实数据的方法 set_cache('my_key', actual_data, ex=3600) print(f'Refreshed Data: {actual_data}') ``` 这体现了典型的缓存模式逻辑流程:先查询是否有匹配的结果存在于高速缓冲区头;一旦发现缺失情况就转而请求底层较慢但更权威的信息源,最后再同步刷新到前端展示给用户的同时也补充进去了我们的临时储存池子当中去。 另外值得注意的是,在高并发环境下单纯依赖本地内存可能无法满足需求,因此推荐采用像 Redis 那样的集中式解决方案[^3]。 #### 装饰器封装简化开发体验 为了进一步优化用户体验并减少重复劳动量,还可以创建自定义装饰器自动处理这些繁琐的过程: ```python class RedisCache: @staticmethod def cache(expire_time): def decorator(func): def wrapper(*args, **kwargs): func_name = f'{func.__name__}_{str(args)}_{str(kwargs)}' res = get_cache(func_name) if res != False: return res output = func(*args, **kwargs) set_cache(func_name, str(output), ex=expire_time) return output return wrapper return decorator @RedisCache.cache(3600) def expensive_computation(x, y): import time;time.sleep(5);return x+y print(expensive_computation(1,2)) ``` 以上例子说明了怎样构建一个通用型的函数修饰符使得每次调用目标动作前都会优先考虑是否存在有效的近似副本可用从而避免不必要的重算开销。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bridge_go

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值