目录
装饰器示例:
假设你有一个用于处理用户授权的系统。你希望在每个需要验证用户权限的函数中执行相同的检查,而不是在每个函数中都重复编写这个检查代码。这就是装饰器的用武之地。
下面是一个简化的示例,展示如何创建一个简单的装饰器来模拟权限检查:
def require_admin_permission(func):
def wrapper(*args, **kwargs):
user = kwargs.get('user')
if user and user.is_admin:
return func(*args, **kwargs)
else:
raise PermissionError("You don't have permission to access this.")
return wrapper
@require_admin_permission
def delete_user(user):
print(f"Deleting user: {user}")
@require_admin_permission
def edit_profile(user):
print(f"Editing profile for user: {user}")
# 使用装饰器来执行权限检查
delete_user(user=admin_user)
edit_profile(user=regular_user)
在上述示例中,require_admin_permission
是一个装饰器,它执行了一个权限检查:只有拥有管理员权限的用户才能执行被装饰的函数。你可以在 delete_user
和 edit_profile
函数上使用这个装饰器,而不必在每个函数中重复编写权限检查的代码。
总之,装饰器是一个强大的Python特性,它允许你在不修改原始函数代码的情况下,为函数添加额外的功能。通过抽象出通用的代码逻辑,装饰器提高了代码的可重用性和可维护性。
python基础
a =10 ,b =5
number = a if a > b else b 三元表达式
结果为 10
func = lambda x,y : x+y
python中闭包(closure)、装饰器(decorator)、匿名函数(lambda)、内部函数(nested function)和外部函数(outer function)的意思如下:
1. 闭包(closure)
在一个外部函数中定义一个内部函数,内部函数可以记住并 access 外部函数的变量,即使在外部函数返回后仍然存在,这整个代码结构就叫闭包。闭包可以让内部函数持续访问外部函数的变量。
2. 装饰器(decorator)
装饰器本质上是一个函数,用于装饰其他函数,增强其他函数的功能,返回装饰后的新函数。使用@语法将装饰器应用到函数上。
3. 匿名函数(lambda)
匿名函数是没有名字的简单小函数,通常只包含一个表达式,可以接收参数并返回结果,用lambda关键字定义。
4. 内部函数(nested function)
定义在另一个函数内部的函数叫内部函数,它可以访问外部函数的变量,当外部函数返回时内部函数也随之消失。
5. 外部函数(outer function)
一个普通的函数叫外部函数,内部函数就是嵌套在其中的函数。外部函数可以将内部函数作为返回值返回,实现闭包结构。
总结起来,python中这些概念都是相关联的,共同支持函数式编程模式
print(func(1,2))
lambda函数的作用
1.匿名函数,不用给你的函数命名。
2.可以用来给回调函数带入参数。
eval函数的作用是 eval函数与list,str,dict,tuple之间的转化
re.sub 替换
format 函数可以接受不限个参数,位置可以不按顺序。
lower()
内部函数
多层装饰器 带参数
闭包
queryset和instance
queryset
:
queryset里面有多条instance, queryset
可以表示多个实例,它是一组数据库记录的集合。
- 数据类型:
queryset
是一个查询集对象,它代表了一组数据库记录(行)。在Django中,查询集是一个可以被过滤、排序、切片等操作的数据库查询的结果集合。
- 用途:
queryset
用于执行数据库查询,可以从数据库中检索数据。你可以使用Django的ORM(对象关系映射)来定义查询条件,然后将其转换为一个查询集。
- 示例:
queryset = MyModel.objects.filter(status='active')
将会创建一个查询集,包含了status
字段为'active'
的MyModel
模型的记录。
instance
:
- 数据类型:
instance
是一个具体的数据库记录,即一个数据库表中的一行数据。它是模型的一个实例,代表了数据库中的一条记录。
当你已经有一个模型实例,并且要将该实例的更改保存到数据库时,你可以使用save()
方法。通常,你会首先查询数据库以获取现有实例,然后对该实例进行更改,并最后使用save()
将更改保存到数据库。-
article = Article.objects.get(pk=1) article.title = "Updated Title" article.save()
- 用途:
instance
通常用于对单个数据库记录进行操作,如创建、更新或删除。它可以被序列化为JSON或其他格式,用于API响应或其他用途。
- 示例:
instance = MyModel.objects.get(pk=1)
将会获取MyModel
模型中primary key
为1的记录作为一个实例。
serializer_class 是一个序列化器类的引用
request.data是个字典
self.get_object()
将使用该 pk
查找并返回相应的对象。
self.get_serializer()
方法默认会返回与视图类(GenericViewSet
或其子类)相关联的序列化器。它使用视图类中定义的 serializer_class
属性来确定要使用的序列化器类。
序列化(Serialization)和反序列化(Deserialization)是两个相对的概念,它们分别涉及将数据从程序内部结构转换为可传输格式以及将传输格式的数据还原为程序内部结构。下面是它们的不同之处:
序列化(Serialization):
- 序列化是将程序内部的数据结构,比如模型实例、对象或其他数据,转换为可传输的数据格式,如JSON、XML等,以便于在网络上传输或保存到文件中。
- 序列化通常发生在数据从服务器发送给客户端的情况下,如API响应。它将数据转换为客户端可以理解的格式,以便客户端进行解析和处理。
- 在Django REST framework中,序列化通常通过序列化器(Serializer)来完成。
serializer = BookSerializers(instance=book_list, many=True) # 序列化
反序列化(Deserialization):
- 反序列化是将可传输的数据格式,如JSON、XML等,转换为程序内部的数据结构,如模型实例、对象或其他数据。
- 反序列化通常发生在数据从客户端发送到服务器的情况下,如API请求。服务器需要将客户端发送的数据还原为可操作的对象,以便进一步的验证、处理和保存。
- 在Django REST framework中,反序列化通常也通过序列化器(Serializer)来完成。
总结:序列化和反序列化是将数据从程序内部结构到可传输格式、再从可传输格式到程序内部结构的两个过程。序列化通常发生在服务器向客户端发送数据的情况下,而反序列化通常发生在客户端向服务器发送数据的情况下。这两个过程是构建API时非常重要的步骤,它们使得数据在客户端和服务器之间能够有效地传输和交换。
serializer = BookSerializers(data=request.data) # 反序列化 没有instance
通过使用 get_object_or_404 函数从数据库中获取一个 TTopic 模型的实例,使用 article_id 进行过滤。
table_instance = get_object_or_404(TTopic, article_id=article_id)