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 中,如果要传递类似的键值对数据,可能会使用 HashMapTreeMap。因此,{'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,用来设置响应的状态码。
相关推荐
大数据追光猿10 分钟前
【深度学习】Pytorch项目实战-基于协同过滤实现物品推荐系统
人工智能·pytorch·python·深度学习·ai编程·推荐算法
师范大学生18 分钟前
基于CNN的FashionMNIST数据集识别2——模型训练
python·深度学习·cnn
web1376560764326 分钟前
纯 Python、Django、FastAPI、Flask、Pyramid、Jupyter、dbt 解析和差异分析
python·django·fastapi
大模型铲屎官29 分钟前
哈希表入门到精通:从原理到 Python 实现全解析
开发语言·数据结构·python·算法·哈希算法·哈希表
qq4054251971 小时前
基于python的旅客游记和轨迹分析可视化系统设计(新)
开发语言·python
m0_594526301 小时前
基于 PyQt5 实现分组列表滚动吸顶效果
开发语言·python·qt
thinkMoreAndDoMore2 小时前
深度学习(3)-TensorFlow入门(常数张量和变量)
开发语言·人工智能·python
kngines3 小时前
【Python量化金融实战】-第1章:Python量化金融概述:1.4 开发环境搭建:Jupyter Notebook、VS Code、PyCharm
python·量化金融
kngines3 小时前
【Python量化金融实战】-第1章:Python量化金融概述:1.2 Python在量化金融中的优势与生态
python·量化金融
wapicn993 小时前
‌挖数据平台对接DeepSeek推出一键云端部署功能:API接口驱动金融、汽车等行业智能化升级
java·人工智能·python·金融·汽车·php