理解_getattr_方法

Posted shenjianping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解_getattr_方法相关的知识,希望对你有一定的参考价值。

  在学习rest framework的过程中,rest framework的request是经过重构的,但是如果调用重构对象request中的属性,如果属性不存在会调用原request对象中的属性,它使用的就是__getattr__方法。

class Request(object):
    """
    Wrapper allowing to enhance a standard `HttpRequest` instance.

    Kwargs:
        - request(HttpRequest). The original request instance.
        - parsers_classes(list/tuple). The parsers to use for parsing the
          request content.
        - authentication_classes(list/tuple). The authentications used to try
          authenticating the request‘s user.
    """
...

       def __getattr__(self, attr):
        """
        If an attribute does not exist on this instance, then we also attempt
        to proxy it to the underlying HttpRequest object.
        """
        try:
            return getattr(self._request, attr)
        except AttributeError:
            return self.__getattribute__(attr)
...

  在新构建的Request中存在__getattr__,假如调用request.GET,新构建的request中如果没有GET属性的话,就会调用__getattr__方法,并且将GET传递给__getattr__方法,此时返回的就是:

    getattr(self._request, GET)

总结:

  • _getattr__可以动态返回一个属性;
  • 当调用一个对象不存在的属性时,Python会试图调用该对象__getattr__(self,attr)方法

以上是关于理解_getattr_方法的主要内容,如果未能解决你的问题,请参考以下文章

__getattr__ 等价于方法

Python的__getattr__和__getattribute__

python中__getattr__和__getattribute__区别

[py]python str getattr特殊方法

__getattr __,newstyle vs oldstyle类的不对称行为

__getattr__ 在模块上