自学内容网 自学内容网

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

原文地址:https://blog.csdn.net/weixin_43895362/article/details/142491153

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!