Django中类方法以request为首个参数时,如何调用类内其他方法?
Python Django 类内方法调用问题解决
从PHP/Laravel转过来的话,得先理清Python类方法的基本规则:Python的实例方法必须把self作为第一个参数(对应PHP里的$this),这样才能访问类内的其他实例方法或属性。你的问题核心是没搞对方法参数的顺序和方法类型,下面给你两种可行的解决方案:
方案一:将方法都定义为实例方法
把login和verifyToken都改成标准的实例方法,login的参数顺序是self在前、request在后,这样既能通过self调用verifyToken,也能正常获取request:
class CustomAuth: def verifyToken(self, token): # 这里可以访问实例属性(如果有的话) pass def login(self, request): data = request.body # 从request中提取token,示例值仅作演示 token = "从request里拿到的token" # 通过self调用类内的verifyToken方法 self.verifyToken(token)
方案二:将verifyToken定义为静态方法
如果verifyToken不需要访问类的实例属性,只是一个独立的工具方法,可以用@staticmethod装饰器把它改成静态方法,这样不需要self参数,login作为实例方法依然可以正常调用它:
class CustomAuth: @staticmethod def verifyToken(token): # 纯工具方法,不需要访问实例属性 pass def login(self, request): data = request.body token = "从request里拿到的token" # 两种调用方式都可行 self.verifyToken(token) # 或者直接用类名调用 CustomAuth.verifyToken(token)
关键说明
- Python里实例方法的第一个参数必须是
self,用来代表当前类的实例,通过它可以调用其他实例方法或访问实例属性,这和PHP的$this作用一致。 - 你之前的误区是把
request放在了self前面,只要调整参数顺序(self在前,request在后),就能同时满足调用类内方法和获取请求的需求。
内容的提问来源于stack exchange,提问作者Anway Anand Bhagwat
相关产品推荐
相关产品推荐

