Книга на вашем родном языке Переводы 7 1 Доступные переводы переводы 7 3 Предисловие 16 1
Скачать 0.91 Mb.
|
quietly – англ. тихо (прим.перев.) 5 recursive – англ. рекурсивно (прим.перев.) 13.2. Решение A Byte of Python (Russian), Версия имя создаваемого архива, за которым указывается список файлов и каталогов для резервного копирования. Мы превращаем список source в строку, используя уже знакомый нам метод Затем мы, наконец, выполняем команду при помощи функции os.system , которая запускает команду так, как будто она была запущена из системы, те. из командной оболочки. Она возвращает, если команда выполнена успешно, в противном случае она возвращает код ошибки. В зависимости от вывода команды, мы печатаем соответствующее сообщение о том, успешным было создание резервных копий или нет. Вот и всё, мы создали сценарий для сохранения резервных копий наших важных файлов! Замечание для пользователей Вместо управляющей последовательности для обратной наклонной черты могут использоваться «сырые» 6 строки. Например, можно писать « C:\\Documents » или « r'C:\ Documents' ». Однако, не используйте « 'C:\Documents' », так как в этом случае окажется, что вы пытаетесь применить неизвестную управляющую последовательность \D Теперь, когда у насесть рабочий сценарий резервного копирования, мы можем использовать его для создания копий наших файлов. Пользователями рекомендуется сделать этот программный файл исполнимым , чтобы иметь возможность запускать его в любое время из любого места. Это называется операционной фазой или развёрты- ванием программы. Программа, приведённая выше, работает корректно, но (обычно) поначалу программы не работают так, как вы того ожидаете. Проблемы могут возникать вследствие неправильного проектирования программы, допущения ошибки при наборе программного кода и т.д. В таких случаях приходится возвращаться к стадии проектирования или отладки программы Вторая версия Первая версия нашего сценария работает. Тем не менее, его можно улучшить так, чтобы было удобнее пользоваться в повседневной работе. Это называется стадией поддержки программы. Одно из улучшений, показавшееся мне полезным, – это лучший механизм именования файлов использование времени в качестве имени файла, сохраняющегося в каталог с текущей датой в качестве имени, который в свою очередь, расположен в главном каталоге – англ. сырой, необработанный (прим.перев) 13.3. Вторая версия A Byte of Python (Russian), Версия для хранения резервных копий. Первое достоинство этого состоит в том, что копии хранятся в иерархической структуре, которой легче управлять. Второе достоинство – в том, что имена файлов намного короче. Третье достоинство состоит в том, что по именам каталогов можно легко определить, в какие дни создавались резервные копии, так как каталог создаётся только в случае резервного копирования данных в этот день. Сохраните как backup_ver2.py : import os import time # 1. Файлы и каталоги, которые необходимо скопировать, собираются в список Documents"' , 'C: \\Code' ] # Заметьте, что для имён, содержащих пробелы, необходимо использовать двойные кавычки внутри строки 2. Резервные копии должны храниться в основном каталоге резерва Подставьте ваш путь 3. Файлы помещаются в архив 4. Текущая дата служит именем подкаталога в основном каталоге sep + time strftime( '%Y%m %d ' ) # Текущее время служит именем архива strftime( '%H%M%S' ) # Создаём каталог, если его ещё нет not os path exists(today): os mkdir(today) # создание каталога ( 'Каталог успешно создан, today) # Имя файла sep + now + '.zip' # 5. Используем команду "zip" для помещения файлов в архив -qr {0} {1} " format(target, ' ' join(source)) # Запускаем создание резервной копии Резервная копия успешно создана в, Создание резервной копии НЕ УДАЛОСЬ' ) Вывод: $ python3 Каталог успешно создан Резервная копия успешно создана в продолжение наследующей странице. Вторая версия A Byte of Python (Russian), Версия продолжение с предыдущей страницы python3 Резервная копия успешно создана в Как это работает: Большая часть программы осталась прежней. Разница в том, что теперь мы проверяем, существует ли каталог с именем, соответствующем текущей дате, внутри главного каталога для хранения резервных копий. Для этого мы используем функцию os.path.exists . Если он не существует, мы создаём его функцией os.mkdir 13.4 Третья версия Вторая версия уже удобнее для работы с большим количеством резервных копий. С другой стороны, когда их много, становится трудно отличить, какая копия для чего. Например, мы могли внести значительные изменения в какую-то программу или презентацию, и теперь хотим указать суть этих изменений в имени архива. Этого легко можно достичь добавлением пользовательского комментария к имени zip-архива. Примечание: Следующая программа не работает, так что не переживайте, просто проследуйте по ней, так как в ней содержится урок. Сохраните как backup_ver3.py import os import time # 1. Файлы и каталоги, которые необходимо скопировать, собираются в список Documents"' , 'C: \\Code' ] # Заметьте, что для имён, содержащих пробелы, необходимо использовать двойные кавычки внутри строки 2. Резервные копии должны храниться в основном каталоге резерва Подставьте ваш путь 3. Файлы помещаются в архив 4. Текущая дата служит именем подкаталога в основном каталоге sep + time strftime( '%Y%m %d ' ) # Текущее время служит именем архива продолжение наследующей странице. Третья версия A Byte of Python (Russian), Версия продолжение с предыдущей страницы Запрашиваем комментарий пользователя для имени файла comment = input ( 'Введите комментарий --> ' ) if len (comment) == 0 : # проверяем, введён ли комментарий sep + now + '.zip' else : target = today + os sep + now + '_' + comment replace( ' ' , '_' ) + '.zip' # Создаём каталог, если его ещё нет not os path exists(today): os mkdir(today) # создание каталога ( 'Каталог успешно создан, today) # 5. Используем команду "zip" для помещения файлов в архив -qr {0} {1} " format(target, ' ' join(source)) # Запускаем создание резервной копии Резервная копия успешно создана в, Создание резервной копии НЕ УДАЛОСЬ' ) Вывод: $ python3 backup_ver3.py File "backup_ver3.py", line 25 target = today + os.sep + now + '_' + ^ SyntaxError: invalid Как это (не) работает: Эта программа не работает Python сообщает об обнаружении ошибки синтаксиса, что означает, что сценарий не удовлетворяет структуре, которую ожидает увидеть Python. Когда Python выдаёт сообщение об ошибке, он также указывает нам на место ошибки. Так что мы начинаем отладку программы с этой строки. При внимательном рассмотрении, мы видим, что одна логическая строка была разбита на две физические строки, номы не указали, что эти две физические строки являются частью одной. Наделе же Python просто обнаружил оператор сложения ( + ) без соответствующего операнда в той же логической строке, а поэтому не знает, как продолжать. Помните, что мы можем указать, что логическая строка продолжается наследующей физической при помощи обратной наклонной черты в конце физической строки. Внесём это исправление в нашу программу. Коррекция программы при обнаружении ошибок и. Третья версия A Byte of Python (Russian), Версия называется отладкой 13.5 Четвёртая версия Сохраните как backup_ver4.py import os import time # 1. Файлы и каталоги, которые необходимо скопировать, собираются в список Documents"' , 'C: \\Code' ] # Заметьте, что для имён, содержащих пробелы, необходимо использовать двойные кавычки внутри строки 2. Резервные копии должны храниться в основном каталоге резерва Подставьте ваш путь 3. Файлы помещаются в архив 4. Текущая дата служит именем подкаталога в основном каталоге sep + time strftime( '%Y%m %d ' ) # Текущее время служит именем архива strftime( '%H%M%S' ) # Запрашиваем комментарий пользователя для имени файла comment = input ( 'Введите комментарий --> ' ) if len (comment) == 0 : # проверяем, введён ли комментарий sep + now + '.zip' else : target = today + os sep + now + '_' + \ comment replace( ' ' , '_' ) + '.zip' # Создаём каталог, если его ещё нет not os path exists(today): os mkdir(today) # создание каталога ( 'Каталог успешно создан, today) # 5. Используем команду "zip" для помещения файлов в архив -qr {0} {1} " format(target, ' ' join(source)) # Запускаем создание резервной копии Резервная копия успешно создана в, Создание резервной копии НЕ УДАЛОСЬ fixing – устранение «багов», исправление ошибок (прим.перев) 13.5. Четвёртая версия A Byte of Python (Russian), Версия Вывод python3 Введите комментарий --> added new Резервная копия успешно создана в E:\Backup\20080702\202836_added_new_ , → examples.zip $ python3 Введите комментарий -Резервная копия успешно создана в Как это работает: Теперь эта программа работает Давайте просмотрим все улучшения, сделанные нами для версии 3. Мы запрашиваем пользовательский комментарий при помощи функции input , а затем проверяем, ввёл ли пользователь что-либо, определяя длину введённой строки функцией len . Если пользователь просто нажал, не вводя никакого текста (может быть, это было регулярное создание резервной копии, или никаких особых изменений внесено не было), мы продолжаем также, как делали до сих пор. Если же комментарий был введён, он добавляется к имени архива перед расширением. Обратите внимание, что мы заменяем пробелы в комментарии подчёркиваниями: управлять файлами без пробелов в именах намного легче Дополнительные усовершенствования Четвёртая версия – вполне удовлетворительный рабочий сценарий для большинства пользователей, однако нет пределов совершенства. Например, в программу можно добавить уровень подробности 8 вывода, чтобы при указании параметра « -v » она становилась более «разговорчивой». Ещё одним возможным улучшением была бы возможность передавать сценарию другие файлы и каталоги прямо в командной строке. Эти имена можно получать из списка sys. argv и добавлять к нашему списку source при помощи метода extend класса Наиболее важным усовершенствованием было бы прекращение использования os. system для создания архивов, а применение вместо него встроенных модулей zipfile или tarfile . Они являются частью стандартной библиотеки, поэтому всегда доступны для использования без зависимости от внешней программы zip на компьютере – англ. многословность. Применительно к компьютерным программам обозначает степень подробности выводимых программой сообщений, те. степень разговорчивости программы. Отсюда и название этого параметра (прим.перев) 13.6. Дополнительные усовершенствования A Byte of Python (Russian), Версия В приведённых примерах мы использовали способ с os.system для создания резервных копий исключительно в педагогических целях, чтобы пример был достаточно прост для понимания любым читателем, но достаточно реален для того, чтобы делать что-то полез- ное. Попробуйте написать пятую версию с использованием модуля zipfile вместо вызова os. system 13.7 Процесс разработки программного обеспечения В процессе создания программы мы прошли через несколько стадий. Эти стадии можно свести примерно в такой список Что (Анализ Как (Проектирование Создание (Реализация Тестирование (Тестирование и Отладка Использование (Развёртывание и Оперирование Поддержка (Усовершенствование) Процедура, которую мы прошли при написании сценария создания резервных копий рекомендуется и для других программ Проведите анализ и проектирование. Начните реализацию с простейшей версии. Протестируйте и отладьте е. Попользуйтесь ею, чтобы убедиться, что она работает, как ожидалось. После этого добавляйте любые необходимые функции, повторяя цикл «Создание-Тестирование-Использование» столько раз, сколько потребуется. Помните, Программы выращиваются, а не строятся Резюме Мы увидели, как создавать свои собственные программы/сценарии на Python, а также различные стадии написания программ. На данном этапе вам будет полезно создать собственную программу по такому рецепту, как мы это делали в настоящей главе, чтобы лучше привыкнуть к Python, равно как и к решению задач. Далее мы обсудим объектно-ориентированное программирование. Процесс разработки программного обеспечения Объектно-ориентированное программирование До сих пор наши программы состояли из функций, те. блоков выражений, которые манипулируют данными. Это называется процедурно-ориентированным стилем программирования. Существует и другой способ организации программ объединять данные и функционал внутри некоего объекта. Это называется объектно-ориентированной парадигмой программирования. В большинстве случаев можно ограничиться процедурным программированием, а при написании большой программы или если решение конкретной задачи того требует, можно переходить к техникам объектно-ориентированного программи- рования. Два основных аспекта объектно-ориентированного программирования – классы и объекты. Класс создаёт новый типа объекты являются экземплярами класса. Аналогично, когда мы говорим о переменных типа int », это означает, что переменные, которые хранят целочисленные значения, являются экземплярами (объектами) класса Замечание для программистов на статических языках Обратите внимание, что даже целые числа рассматриваются как объекты (класса в отличие от C++ и Java (до версии 1.5), где целые числа являются примитивами. См. help(int) для более детального описания этого класса. Программисты на C# и Java могут заметить сходство с концепцией упаковки и распаковки 1 Объекты могут хранить данные в обычных переменных, которые принадлежат объекту. Переменные, принадлежащие объекту или классу, называют полями. Объекты могут также обладать функционалом, те. иметь функции, принадлежащие классу. Такие функции принято называть методами класса. Эта терминология важна, так как она помогает нам отличать независимые функции и переменные от тех, что принадлежат классу или объекту. Всё вместе (поля и методы) принято называть атрибутами класса. Поля бывают двух типов они могут принадлежать каждому отдельному экземпляру объекта класса или всему классу. Они называются переменными экземпляра и переменными класса соответственно and unboxing 108 A Byte of Python (Russian), Версия Класс создаётся ключевым словом class . Поля и методы класса записываются в блоке кода с отступом Методы класса имеют одно отличие от обычных функций они должны иметь дополнительно имя, добавляемое к началу списка параметров. Однако, при вызове метода никакого значения этому параметру присваивать ненужно его укажет Python. Эта переменная указывает на сам объект экземпляра класса, и по традиции она называется Хотя этому параметру можно дать любое имя, настоятельно рекомендуется использовать только имя self ; использование любого другого имени не приветствуется. Есть много достоинств использования стандартного имени во-первых, любой человек, просматривающий вашу программу, легко узнает его во-вторых, некоторые специализированные Интегрированные среды разработки (IDE) изначально рассчитаны на использование Замечание для программистов на C++, Java ив эквивалентно указателю this в C++ и ссылке this в Java и Вы, должно быть, удивляетесь, как Python присваивает значение self и почему вам ненужно указывать это значение самостоятельно. Поясним это на примере. Предположим, у насесть класс с именем и экземпляр этого класса с именем myobject . При вызове метода этого объекта, например, « myobject.method(arg1, arg2) », Python автоматически превращает это в « MyClass.method(myobject, arg1, arg2) » – в этом и состоит смысл Это также означает, что если какой-либо метод не принимает аргументов, у него всё равно будет один аргумент – self 14.2 Классы Простейший класс показан в следующем примере (сохраните как simplestclass.py ). class Person : pass # Пустой блок p = Person() (p) Вывод: 2 self – англ. сам (прим.перев.) 14.1. self 109 A Byte of Python (Russian), Версия 2.02 $ python3 simplestclass.py <__main__.Person object at Как это работает: Мы создаём новый класс при помощи оператора class и имени класса. За этим следует блок выражений, формирующих тело класса. В данном случае блоку нас пуст, на что указывает оператор Далее мы создаём объект-экземпляр класса, записывая имя класса со скобками. (Мы узнаем больше о реализации в следующем разделе. Для проверки мы выясняем тип переменной, просто выводя её на экран. Так мы видим, что у насесть экземпляр класса в модуле __main__ Обратите внимание, что выводится также и адрес в памяти компьютера, где хранится ваш объект. На вашем компьютере адрес будет другим, так как хранит объекты там, где имеется свободное место Методы объектов Итак, мы выяснили что классы/объекты могут иметь методы, представляющие собой функции, за исключением дополнительной переменной self . А теперь давайте рассмотрим пример (сохраните как Привет Как дела sayHi() # Этот короткий пример можно также записать как Вывод python3 Привет Как дела? Как это работает: Здесь мы видим self в действии. Обратите внимание, что метод sayHi не принимает параметров, но тем не менее, имеет self в определении функции. Методы объектов A Byte of Python (Russian), Версия 2.02 14.4 Метод __init__ Существует много методов, играющих специальную роль в классах Python. Сейчас мы увидим значительность метода __init__ Метод __init__ запускается, как только объект класса реализуется. Этот метод полезен для осуществления разного рода инициализации, необходимой для данного объекта. Обратите внимание на двойные подчёркивания вначале ив конце имени. |