2015-06-03 6 views
0

Я читал пример кода для аутентификации с использованием токенов, и есть строка, которую я вообще не понимаю.Вызов класса как функции?

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) 

Синтаксиса предполагает, что класс вызываются как функция, которую я никогда не видел в свое короткое программировании времени. Кто-нибудь еще, что это значит?

+1

'ИмяКласса()' просто означает * создать новый экземпляр 'ClassName', без аргументов *, что USUA lly означает вызов ClassName .__ init__' (или иногда 'ClassName .__ new__'). Таким образом, это просто передача одного экземпляра 'SignatureMethod_RSA_SHA1' в качестве первого аргумента' client.set_signature_method'. – jonrsharpe

+0

... и методы '__init__' или' __new__' наследуются от родительских классов, в этом случае 'oauth.SignatureMethod'. – mdurant

+1

Возможно, вы захотите прочитать [учебник по классам] (https://docs.python.org/2/tutorial/classes.html#a-first-look-at-classes). – mkrieger1

ответ

2

Так вы создаете экземпляр класса, он не используется как функция (хотя технически он вызывает классы __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() используется):

>>> foo.add_to_list('a') 
>>> foo.my_list 
[2, 4, 1, 4, 8, 0, 3, 'a'] 
0

SignatureMethod_RSA_SHA1() - это просто класс конструктора. Вызывается его функция __init__.

Иными словами - set_signature_method вызывается с экземпляром SignatureMethod_RSA_SHA1.

Смежные вопросы