将一个类称为函数?

时间:2015-06-03 13:19:16

标签: 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(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)

语法表明该类被称为函数,这是我在短时间编程中从未见过的。这有什么意思吗?

2 个答案:

答案 0 :(得分:2)

这就是你实例化一个类的方法,它没有被用作函数(虽然从技术上来说它是调用类Answer方法)。

__init__()显然采用某种签名方法类的实例(不确定client.set_signature_method()是否是唯一可能的类型)并且很可能将其挂在SignatureMethod_RSA_SHA1()对象上可通过client或其他一些财产访问。

这与做:

相同
client.signature_method

如果您不需要在sig_method = SignatureMethod_RSA_SHA1() client.set_signature_method(sig_method) 个实例之外再次访问sig_method,这只是一种较短的方式。

更熟悉的例子是:

client

这样a_list = list() a_dict = dict() 及其属性和方法现在可供SignatureMethod_RSA_SHA1()实例使用。更简单的例子我们可以这样做:

client

所以现在该列表可供该类使用,因此它的方法也是如此:

>>> 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_to_list()的使用方式):

SignatureMethod_RSA_SHA1()

答案 1 :(得分:0)

SignatureMethod_RSA_SHA1()只是类构造函数。它的__init__函数被调用。

换句话说 - 使用set_signature_method实例调用SignatureMethod_RSA_SHA1