当前位置: 首页 > article >正文

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。

参数详解

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

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,用来设置响应的状态码。

http://www.kler.cn/a/317738.html

相关文章:

  • 软件工程笔记二—— 软件生存期模型
  • Android 13 实现屏幕熄屏一段时候后关闭 Wi-Fi 和清空多任务列表
  • 【C++学习(37)】并发性模式:如生产者-消费者、读写锁等。 架构模式:如MVC、MVVM等。属于23 种设计模式吗? RAII 的关系?
  • Bugku CTF_Web——点login咋没反应
  • LeetCode 86.分隔链表
  • 简单叙述 Spring Boot 启动过程
  • 【裸机装机系列】11.kali(ubuntu)-优化-扩展root分区存储空间
  • 快递预约取件API接口代码
  • 手机上轻松解压并处理 JSON 文件
  • [单master节点k8s部署]22.构建EFK日志收集平台(一)
  • 网站服务器怎么计算同时在线人数?
  • python基础(1)pyenv安装和对Django使用
  • Python编码系列—Python外观模式:简化复杂系统的快捷方式
  • pytorch--流水线并行
  • pandas外文文档快速入门
  • UNet 眼底血管分割实战教程
  • Python Flask网页开发基本框架
  • 大数据新视界 --大数据大厂之 Vue.js 与大数据可视化:打造惊艳的数据界面
  • 【Java面向对象高级06】static的应用知识:代码块
  • java开发jmeter采样器
  • 【AI写作】介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用
  • 目标检测任务中xml标签文件修改
  • 【学习笔记】Transformer架构探讨
  • [ IDE ] SEGGER Embedded Studio for RISC-V
  • C++初阶学习——探索STL奥秘——反向迭代器
  • [Leetcode 543][Easy]-二叉树的直径-递归