июля 29, 2010Море, море...

Как могли заметить уважаемые посетители моего блога, я не публикую посты в последнее время. Причина очень проста — отдыхаю :) В этом году решил с девушкой поехать в Алушту. По возвращению постараюсь немного поделиться впечатлениями и выложить несколько фотографий.
До скорого!

1
2
3
str_unicode = u'unicode string'
str_utf8 = str_unicode.encode('utf-8')
str_cp1251 = str_unicode.encode('cp1251')
1
2
3
str_cp1251 = 'Тестовая строка'
str_unicode = unicode(str_cp1251, 'cp1251')    # способ 1
str_unicode2 = str_cp1251.decode('cp1251')     # способ 2

Продолжаю отвечать на вопросы, которые могут задать на собеседовании Python-разработчику.

Итак, в чем разница между __new__ и __init__ ? Разберемся с этим на примере кода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A(object):
    _dict = dict()

    def __new__(cls):
        if 'key' in A._dict:
                print "EXISTS"
                return A._dict['key']
        else:
                print "NEW"
                return super(A, cls).__new__(cls)

    def __init__(self):
        print "INIT"
        A._dict['key'] = self
        print ""

a1 = A()
a2 = A()
a3 = A()

Результатом работы скрипта будет вывод:

NEW
INIT

EXISTS
INIT

EXISTS
INIT

Мы видим, что __init__ вызывается после __new__, т.к. __new__ — классовый метод, переопределив который можно контролировать процесс создания нового экземпляра класса, именно его (экземпляр) либо None и возвращает __new__. __init__ же ничего не возвращает, он только отвечает за инициализацию созданного экземпляра.

ООП на Питоне

Имеется две функции:

1
2
def a(*args):
        print args

и

1
2
def b(**args):
        print args

Чем они отличаются? Обе функции принимают произвольное число аргументов об этом свидетельствует символ «*» перед args, но функция b позволяет принимать именованные. В теле a параметр обрабатывается как кортеж. В подтверждение тому немного изменим тело первой функции и вызовем ее:

1
2
3
4
def a(*args):
        print type(args)

a(1, 2, 3, 4, 5, "вышел", "зайчик", "погулять")    # type 'tuple'

Параметр args в теле функции b обрабатывается как словарь, содержащий пары название-значение произвольного количества аргументов:

1
2
3
4
def b(**args):
        print type(args)

b(name='anry', age=20)    # type 'dict'

«REST (сокр. англ. Representational State Transfer, «передача состояния представления») — подход к архитектуре сетевых протоколов, обеспечивающих доступ к информационным ресурсам. Был описан и популяризован в 2000 году Ройем Филдингом (Roy Fielding), одним из создателей протокола HTTP. Самой известной системой, построенной в значительной степени по архитектуре REST, является современная Всемирная паутина.» © Wiki

Характеристики REST

Для начала приведу краткий перечень некоторых основных аспектов REST:

  • Распределенная сеть взаимосвязанных и наделенных правами доступа документов, расположенных по всему миру на компьютерах пользователей. По словам Р. Филдинга «распределенная гипермедиа система».
  • Клиент-серверная архитектура.
  • Состояние сеанса не сохраняется на сервере. Каждый запрос, сделанный клиентом, должен содержать все необходимые сведения для обработки его веб-сервером. Предыдущие же запросы серверу знать не обязательно, что является одной из причин почему клиенты передают серверу «cookie» каждый раз при попытке доступа к ресурсу. HTTP-сессия длится ровно столько, сколько длится «запрос-ответ» между клиентом и сервером. (Для справки: в протоколах FTP и SSH, например, «общение» между клиентом и сервером может происходить более одного раза за сеанс, поэтому состояние сеанса хранится на сервере.)
  • Ресурсы. Так как REST решает проблемы управления «распределенной сетью документов», то единицей хранения является документ (ресурс). Статическая веб-страница является ресурсом, но согласно REST она должна быть динамически сгенерирована веб-приложением. В мире HTTP каждый ресурс имеет URL — уникальный идентификатор. Например, http://yandex.ru/yandsearch?text=python&lr=191 — может быть динамически создан поисковой системой после вашего запроса. В итоге ресурс однозначно определяется URL.
  • Представления. Когда вы запрашиваете ресурс из браузера, сервер должен вернуть его представление. В самом общем случае ресурс имеет только одно представление — файл на сервере. Однако веб-клиент может по-своему интерпретировать представление ресурса в зависимости от задачи.

REST-операции:

  • GET — получение представления запрашиваемого ресурса.
  • POST — изменение ресурса, чтобы привести его в соответствие с новым представлением.
  • PUT — создание нового ресурса из представления.
  • DELETE — удаление существующего ресурса.

HTTP: Реальный REST

Принципы REST являются общепринятыми, однако главным образом они реализованы в протоколе HTTP. Лучший способ понять это — практика. Напишем маленький локальный веб-сервер, который пока ничего не будет делать =) :

1
2
3
4
5
6
7
8
9
10
# -*- coding: UTF-8 -*-
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
    server_address=('', 1512)
    httpd=server_class(server_address, handler_class)
    httpd.serve_forever()

if __name__ == '__main__':
    run()

Запустите скрипт, теперь мы имеем доступ к веб-серверу http://localhost:1512 . Если порт 1512 уже занят, просто измените номер на любой свободный!

Скрипт управляет объектом HTTPServer, который прослушивает заданный порт на наличие HTTP-запросов. Каждый раз при запросе в браузере адреса http://localhost:1512, сервер будет обрабатывать его пока вы не «убьете»  скрипт. Каталог, из которого был запущен сервер, становится ДОСТУПНЫМ REST-ресурсом, а также все его файлы и подкаталоги.

Продолжение следует...

P.S. Статья про REST на Хабре (не моя =) )


Страница 1 из 20123451020...Последняя »

© 2009 PodCode – IT-заметки | Powered by Wordpress