__call__还是__init__在这里打电话?不要不理解哪个和为什么

时间:2018-11-11 05:10:20

标签: python class constructor call init

编辑:很遗憾,What is the difference between __init__ and __call__ in Python?

中没有回答
arrayName= $responsebody.split(/{(.*?)}/)

我了解了query = ('INSERT INTO heat_table (' + ', '.join('col%d' % i for i in range(3, len(data) + 3)) + ') VALUES (' + ', '.join('?' * len(data)) + ')') class OAuth2Bearer(requests.auth.AuthBase): def __init__(self, api_key, access_token): self._api_key = api_key self._access_token = access_token def __call__(self, r): r.headers['Api-Key'] = self._api_key r.headers['Authorization'] = "Bearer {}".format(self._access_token) return r ############# class AllegroAuthHandler(object): def apply_auth(self): return OAuth2Bearer(self._api_key, self.access_token) # what will happen here? ,但是我仍然不理解这段代码中发生的事情

我不明白:

1。)将调用哪个方法__init____call__

2。)如果为__init__,则__call__不返回任何内容

3。)如果使用__init__,则无法使用两个参数调用__init__

我认为应该调用__call__,因为在下面的示例中,我们只有__call__,而不是this answer中的__init__

X()

3 个答案:

答案 0 :(得分:2)

我相信您正在寻找this

在Python中调用对象的行为受其类型的__call__约束,因此:

OAuth2Bearer(args)

实际上是这样:

type(OAuth2Bearer).__call__(OAuth2Bearer, args)

OAuth2Bearer是什么类型,也称为“元类”?如果不是type(默认值),则为type的子类(严格由Python强制执行)。从上面的链接:

  

如果我们忽略错误检查一分钟,那么对于常规的类实例化,这大致等效于:

def __call__(obj_type, *args, **kwargs):
    obj = obj_type.__new__(*args, **kwargs)
    if obj is not None and issubclass(obj, obj_type):
        obj.__init__(*args, **kwargs)
    return obj

因此,调用的结果是传递到object.__new__后的object.__init__的结果。 object.__new__基本上只是为新对象分配空间,这是AFAIK这样做的唯一方法。要调用OAuth2Bearer.__call__,您必须调用实例:

OAuth2Bearer(init_args)(call_args)

答案 1 :(得分:0)

我会说这里都不是

引起混乱的代码部分是

OAuth2Bearer(self._api_key, self.access_token)

您需要了解一件事:尽管OAuth2Bearer是类的名称,但它也是类type(内置类)的对象。因此,当您编写上面的行时,实际上叫做

type.__call__()

如果您尝试使用以下代码,可以很容易地验证这一点:

print(repr(OAuth2Bearer.__call__))

它将返回以下内容:

<method-wrapper '__call__' of type object at 0x12345678>

type.__call__的工作和返回在其他问题中得到了很好的说明:它调用OAuth2Bearer.__new__()创建一个对象,然后使用obj.__init__()初始化该对象,并返回该对象

您可以这样思考OAuth2Bearer(self._api_key, self.access_token)的内容(用于说明目的的伪代码)

OAuth2Bearer(self._api_key, self.access_token):
    obj = OAuth2Bearer.__new__(OAuth2Bearer, self._api_key, self.access_token)
    obj.__init__()
    return obj

答案 2 :(得分:0)

与类一起使用时会调用

__init__()

__call__()与Class对象一起使用时会被调用