Python 方法传参详解

参数

位置参数 和关键字参数

  • data={'error': str(e)}:传递给了 __init__ 方法中的 data 参数,表示需要返回给客户端的 JSON 数据。
  • status=500:通过 **kwargs 传递给了父类 HttpResponse,并设置了响应状态码为 500。
  • 位置参数 和关键字参数 :在 Python 中,函数可以接受位置参数(data)和关键字参数(status)。关键字参数允许你通过指定参数名来传递数据,比如 status=500。这与 Java 中参数传递的方式有所不同,Java 中函数的参数需要按照声明的顺序传递,除非使用了像 Builder 模式来模拟关键字参数。

  • {} 表示字典 :在 Python 中,花括号 {} 用于创建字典,类似于 Java 中的 Map。而在 Java 中,如果要传递类似的键值对数据,可能会使用 HashMap 或 TreeMap。因此,{'error': str(e)} 是一个字典,它会被 JsonResponse 序列化为 JSON。

参数详解

python 复制代码
def __init__(
    self,                    # self 是实例
    data,                    # data 是第一个显式传递的参数
    encoder=DjangoJSONEncoder, # encoder 有默认值
    safe=True,               # safe 也有默认值
    json_dumps_params=None,  # json_dumps_params 也有默认值
    **kwargs,                # **kwargs 接受任意数量的关键字参数
):

为什么{'error': str(e)}不对应self,self不是一个位置参数吗?

在 Python 中,self 不是通过参数传递的,而是自动绑定给实例方法的第一个参数。它并不需要我们显式传递。因此,在调用 JsonResponse({'error': str(e)}, status=500) 时,self 已经隐式绑定给了当前 JsonResponse 类的实例。让我们详细解释一下:

1. self 参数解释

  • self 是 Python 类方法中的第一个参数,它指向类的实例,允许方法访问和修改该实例的属性。在调用类的方法时,我们并不显式传递 self,Python 会自动将实例对象传递给方法。

    举个例子,假设你有一个类 MyClass,其中有一个方法 my_method:

python 复制代码
class MyClass:
    def my_method(self, value):
        print(self, value)

obj = MyClass()
obj.my_method(5)  # 实际上相当于 MyClass.my_method(obj, 5)
  • 在上面的例子中,self 被自动绑定为 obj,因此你无需手动传递 self。同理,当你调用 JsonResponse 时,self 会自动绑定到 JsonResponse 的实例上。

    所以,当你调用 JsonResponse({'error': str(e)}, status=500) 时,self 代表创建的 JsonResponse 实例,自动传递,不用显式指定。

2. 为什么 status=500 对应 **kwargs 而不是 encoder=DjangoJSONEncoder

  • 这里关键是 关键字参数(keyword arguments) 和 默认参数(default arguments) 的工作方式。
参数顺序

在 Python 中,参数的传递有一定的顺序,遵循以下规则:

  1. 位置参数(Positional arguments)
  2. 对应的关键字参数(Keyword arguments)
  3. 默认参数(Default arguments)
  4. 任意数量的关键字参数(**kwargs)

当你调用 JsonResponse({'error': str(e)}, status=500) 时,参数是如何被映射的:

  1. 位置参数 :{'error': str(e)} 作为第一个位置参数传递给 data。
  2. 关键字参数 :status=500 是一个关键字参数,没有明确列在方法签名中,因此它会被 **kwargs 捕获。
为什么 status=500 没有匹配 encoder
  • encoder 有一个默认值 DjangoJSONEncoder,它只会被覆盖 当且仅当 你显式传递 encoder 参数时(覆盖的就是对应的关键字参数)。
  • 因此,status=500 不会覆盖 encoder,因为你没有通过 encoder 参数传递它。
  • 由于 status 并没有与任何显式定义的参数匹配,它就会被 **kwargs 捕获,并最终传递给父类 HttpResponse,用来设置响应的状态码。
相关推荐
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时3 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
奇思妙想聪明勤奋的小羊3 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1233 天前
2026年第38周GitHub趋势周报
python·科技·github
IZero073 天前
Jev 与 Laya
python·语言模型