Python 将类作为函数调用?
我已经阅读了一些使用令牌进行身份验证的示例代码,有一行我根本不理解Python 将类作为函数调用?,python,class,Python,Class,我已经阅读了一些使用令牌进行身份验证的示例代码,有一行我根本不理解 client.set_signature_method(SignatureMethod_RSA_SHA1()) 具体来说,我不确定“SignatureMethod_RSA_SHA1()”的作用。以下是SignatureMethod类,供参考: class SignatureMethod_RSA_SHA1(oauth.SignatureMethod): name = 'RSA-SHA1' def signing_base(se
client.set_signature_method(SignatureMethod_RSA_SHA1())
具体来说,我不确定“SignatureMethod_RSA_SHA1()”的作用。以下是SignatureMethod类,供参考:
class SignatureMethod_RSA_SHA1(oauth.SignatureMethod):
name = 'RSA-SHA1'
def signing_base(self, request, consumer, token):
if not hasattr(request, 'normalized_url') or request.normalized_url is None:
raise ValueError("Base URL for request is not set.")
sig = ( #Creates the request?
oauth.escape(request.method),
oauth.escape(request.normalized_url),
oauth.escape(request.get_normalized_parameters()),
)
key = '%s&' % oauth.escape(consumer.secret)#
if token:
key += oauth.escape(token.secret)
raw = '&'.join(sig)
return key, raw
def sign(self, request, consumer, token):
"""Builds the base signature string."""
key, raw = self.signing_base(request, consumer, token)
with open('../rsa.pem', 'r') as f:
data = f.read()
privateKeyString = data.strip()
privatekey = keyfactory.parsePrivateKey(privateKeyString)
signature = privatekey.hashAndSign(raw)
return base64.b64encode(signature)
语法表明该类是作为函数调用的,这在我的短时编程中从未见过。其他人知道这意味着什么吗?
SignatureMethod\u RSA\u SHA1()
只是类构造函数。它的\uuuu init\uuuu
函数被调用
换句话说-
set\u signature\u方法
通过SignatureMethod\u RSA\u SHA1
实例调用。这就是实例化类的方式,它没有被用作函数(尽管从技术上讲它调用类\u init\u()
方法)
client.set\u signature\u method()
显然采用了某种签名方法类的实例(不确定SignatureMethod\u RSA\u SHA1()
是否是唯一可能的类型),并且很可能将其挂在client
对象上,以便通过client.signature\u method
或某些其他属性访问
这与执行以下操作相同:
sig_method = SignatureMethod_RSA_SHA1()
client.set_signature_method(sig_method)
如果您不需要在客户端
实例之外再次访问sig_方法
,那么这只是一种较短的方法
更熟悉的例子是:
a_list = list()
a_dict = dict()
这样,SignatureMethod\u RSA\u SHA1()
及其属性和方法现在可用于客户机
实例。例如,我们可以:
>>> class MyClass:
def __init__(self, my_list):
self.my_list = my_list
def add_to_list(self, a_value):
self.my_list.append(a_value)
>>> foo = MyClass(list())
>>> foo.my_list
[]
现在,该类可以使用该列表,其方法也可以使用:
>>> foo.my_list.extend([2,4,1,4,8,0,3,])
>>> foo.my_list
[2, 4, 1, 4, 8, 0, 3]
更重要的是,该类可以在内部使用列表对象方法,如我们的add\u to\u list()
方法(这可能就是SignatureMethod\u RSA\u SHA1()
的使用方式):
ClassName()
只意味着创建ClassName
的新实例,不带任何参数,这通常意味着调用ClassName.\uuuuu init\uuuuuuu
(或者有时是ClassName.\uuuuu new\uuuuuuuuuuu
)。因此,这只是将一个SignatureMethod\u RSA\u SHA1
实例作为第一个参数传递给client.set\u signature\u method
。。。。而\uuuu init\uuuuu
或\uuuu new\uuuuuu
方法是从父类继承的,在本例中是oauth.SignatureMethod
。您可能需要阅读。
>>> foo.add_to_list('a')
>>> foo.my_list
[2, 4, 1, 4, 8, 0, 3, 'a']