不适用于 Python 2,Python 2 与 Python 3 继承包装器

Not working in Python 2, Python 2 vs Python 3 Inheriting a wrapper

我正在开发一个基于 Flask 的 OAuth 项目,该项目有一个 OAuthSignIn class 实例。对于我支持的每个 OAuth 客户端,Facebook、Twitter 和 Google,这个 class 有三个子 classes。服务器上每个实例只有一个实例,它们都包含一个名为 oauth_session 的对象,用于对适当的 OAuth 端点进行端点调用。为确保这些调用代表当前用户,在调用之前,我必须将 oauth_session 对象的 access_token 变量编辑为当前用户的 session['access_token']。我想通过在 super class (OAuthObject) 中找到的包装器来做到这一点。

以下是我在服务器上所做工作的一个非常基本的模型,仅显示它的继承和其他。我制作了一个包装器来编辑子 class 的 oauth_session.access_token 并将其放入 OAuthObect 的超级 class 中,所以我只需要写一次。

from functools import wraps

class OAuthSessionObject():
  def __init__(self):
    self.access_token = "r424jt3g"

class OAuthObject():
  def __init__(self):
    pass

  def auth_request(f):
    @wraps(f)
    def wrapper(self):
      self.oauth_session.access_token = 444
      #self.oauth_session.access_token = session['access_token']
      return f(self)
    return wrapper


class GoogleObject(OAuthObject):
  def __init__(self):
    self.oauth_session = OAuthSessionObject()

  @OAuthObject.auth_request
  def make_request(self):
    print("Making a request with updated access_token:", self.oauth_session.access_token)

google = GoogleObject()
google.make_request()

Python 2 对比 Python 3

这个有问题,它只在 Python 3 中 works,我目前在 heroku 和本地 运行 Python 2 服务器上,我收到以下错误:

@OAuthSignIn.auth_request
TypeError: unbound method auth_request() must be called with OAuthSignIn instance as first argument (got function instance instead)

如何在 Python 2 中完成这项工作??

找到解决方案但需要解释:

为了让它在 Python 2 中工作,我所要做的就是将包装函数修改为如下所示:

@classmethod
def auth_request(self, f):
    @wraps(f)
    def wrapper(self):
        self.oauth_session.access_token = session['access_token']
        return f(self)
    return wrapper

必须将其设为 @classmethod,然后将 self 作为第一个参数添加到 auth_request 声明中。不知道为什么,如果有人想解释为什么在 Python 的两个版本之间会有不同的处理方式,那就太好了。