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
相关产品推荐
相关产品推荐

