You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python派生类参数工作机制及View类参数异常问题咨询

嘿,这个问题其实是实例方法调用时的一个常见参数误区,先帮你理清楚Python派生类参数的核心逻辑,再拆解你的代码问题:

Python中派生类的参数工作原理

派生类(子类)的参数传递核心围绕实例方法的self绑定和继承链的参数流转展开,关键规则有这几点:

  • self的自动绑定:当你调用实例的方法时,Python会自动把当前实例作为第一个参数(也就是方法定义里的self)传递进去,完全不需要手动传入。不管是父类还是子类的方法,只要通过实例调用,这个规则都生效。
  • 构造函数的参数传递:如果子类重写了__init__方法,必须通过super().__init__(...)显式调用父类的构造函数,并传递父类所需的参数,否则父类的初始化逻辑不会执行。如果子类没重写__init__,则会自动继承父类的构造函数逻辑。
  • Mixin类的参数逻辑:Mixin类是用来复用代码的“功能片段”,不会单独实例化。当其他类继承Mixin后,调用Mixin的方法时,self指向的是当前的子类实例,而非Mixin的实例——这也是Mixin能和其他类无缝协作的核心原因。
你的代码问题分析与修正

先看你代码里的两个关键问题:

1. 手动传入self导致参数顺序混乱

在View类的get方法中,你写了:

self.get_session(self,request,*args,*kwargs)

这里犯了一个典型错误:手动传入了self参数。

当你通过self.get_session(...)调用方法时,Python已经自动把当前的View实例作为第一个参数传递给get_session的self形参了。而你额外手动传入self,就导致参数完全错位:

  • 等价于直接调用Mixin.get_session(self, self, request, *args, **kwargs)
  • get_session的self形参:接收第一个self(View实例)
  • get_session的request形参:接收第二个self(还是View实例)
  • 原本的request对象被挤到了*args里

这就是为什么你打印request时看到的是View类实例——它实际接收到的是你手动传入的第二个self!

另外,你代码里的*args,*kwargs是语法错误,正确写法是*args,**kwargs(单星号传位置参数,双星号传关键字参数)。

2. View类未继承Mixin

你的原代码里View类没有继承Mixin,这样View实例根本没有get_session方法,运行时会直接报错,这也是必须修正的点。

修正后的完整代码

class Mixin:
    def get_session(self, request, *args, **kwargs):
        print(self)  # 输出View类的实例,符合预期
        print(request)  # 输出传入的request对象,符合预期

class View(Mixin):  # 让View继承Mixin,才能使用get_session方法
    def get(self, request, *args, **kwargs):
        # 去掉手动传入的self,Python会自动绑定当前实例作为第一个参数
        self.get_session(request, *args, **kwargs)
        pass

内容的提问来源于stack exchange,提问作者Ubaid Parvaiiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:32:43