编辑:很遗憾,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()
答案 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对象一起使用时会被调用