
Как могли заметить уважаемые посетители моего блога, я не публикую посты в последнее время. Причина очень проста — отдыхаю
В этом году решил с девушкой поехать в Алушту. По возвращению постараюсь немного поделиться впечатлениями и выложить несколько фотографий.
До скорого!
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 на Хабре (не моя =) )