Программирование метаклассов на Python
Поднятие объектно-ориентированного программирования на новый уровень
Большинство читателей уже знакомо с концепциями объектно-ориентированного программирования: наследованием, инкапсуляцией, полиморфизмом. Но создание объектов заданного класса с определенными родителями обычно представляется исходно заданной операцией. Оказывается, что ряд новых программных конструкций становится либо более простым, либо вообще хоть сколько-нибудь возможным, если вы можете настраивать процесс создания объектов. Метаклассы разрешают определенные типы "аспектно-ориентированного программирования"; например, можно усилить классы такими характеристиками, как возможности трассировки, объектная персистентность, регистрация исключений и так далее.
Краткий обзор объектно-ориентированного программирования (ООП)
Давайте, потратив полминуты, вспомним, что такое ООП. В языке объектно-ориентированного программирования можно определять классы, задача которых - объединить связанные данные и поведение. Эти классы могут наследовать некоторые или все свойства своих родителей, они также определяют свои собственные атрибуты (данные) или методы (поведение). В результате, классы, как правило, выступают в качестве шаблонов для создания экземпляров (которые время от времени называют просто объектами). Различные экземпляры одного и того же класса обычно имеют разные данные, хотя они будут представлены в одинаковом виде, например, у обоих объектов класса 'Employee' bob и jane есть .salary и .room_number, но значения room (комната) и salary (жалование) у каждого различны.
Яндекс.ДиректВсе объявленияЯ хочу лучше фотографировать! Запишись на бесплатный онлайн-семинар по фотографии и секретам мастерства! webinar.disted.ru
Некоторые объектно-ориентированные языки программирования, включая Python, предусматривают интроспективные (или рефлексивные) объекты. Другими словами, интроспективный объект может сам себя описывать: к какому классу принадлежит этот экземпляр? Кто предки этого класса? Какие методы и атрибуты доступны объекту? Интроспекция позволяет функции или методу, управляющему объектами, принимать решения, основываясь на том, какой вид объекта передается. Даже без интроспекции функции часто ветвятся, опираясь на данные экземпляра - например, маршрут к jane.room_number отличается от пути к bob.room_number, поскольку они в "различных комнатах" (значения room у них различны). С помощью интроспекции также можно безошибочно вычислить bonus (премиальные) jane, пропустив это вычисление для bob, например, потому что у jane есть атрибут .profit_share или из-за того, что bob является экземпляром производного класса Hourly(Employee).
"Метапрограммный" ответ
Базовая система ООП, очерченная выше, является достаточно мощной. Однако, в этом описании один момент не получил должного внимания: в Python (и других языках) сами классы являются объектами, которые можно передавать и подвергать интроспекции. Но поскольку объекты, как отмечалось, создаются с использованием классов в качестве шаблонов, то что же является шаблоном для создания классов? Разумеется, метаклассы.
В Python всегда были метаклассы. Однако, технология, задействованная в метаклассах, стала гораздо более очевидной с выходом Python 2.2. А именно, в версии 2.2 Python перестал быть языком только с одним специальным (обычно невидимым) метаклассом, который создавал каждый объект класса. Теперь программисты могут наследоваться от встроенного метакласса type и даже динамически генерировать классы с различными метаклассами. Разумеется, только то, что вы можете манипулировать метаклассами на Python 2.2, еще не объясняет, зачем вам это.
Более того, вам не нужно использовать метаклассы, определенные пользователем, чтобы управлять созданием классов. Несколько менее головоломная концепция - фабрика классов (class factory): обыкновенная функция может возвращать класс, который был динамически создан в пределах тела функции. В традиционном синтаксисе Python вы можете написать: Далее...
Ссылки на изменяемые объекты долго живут
К изменяемым объектам в Python относятся списки, словари и объекты наследуемые от базового класса object. Будьте крайне внимательны при написании программ, помните что связь на изменяемый объект сохраняется всегда.
class M(object): def __init__(self, data): self.__data = data def data(self): return self.__data init_data = ['php'] m = M(init_data) print m.data() # ['php'] init_data.append('python') # объекты init_data и M.__data ссылаются на один и тот же объект print init_data # ['php', 'python'] print m.data() # ['php', 'python'] data = m.data() print data # ['php', 'python'] data.append('ruby') # теперь уже 3 объекта ссылаются на одну и ту же переменную print data # ['php', 'python', 'ruby'] print init_data # ['php', 'python', 'ruby'] print m.data() # ['php', 'python', 'ruby']
На самом деле даже если вы отправляете объект в функцию, связь не теряется на выходе. Функция возвращает ссылку на переменную.
M = lambda data: data init_data = ['php'] m = M(init_data) m.append('python') print m # ['php', 'python'] print init_data # ['php', 'python'] print m is init_data # True
Будьте внимательны при написании программ, иногда необходимо чтобы метод класса или функция вернули новый объект, а не ссылку. Создать новый объект например из списка можно - list(lst), из словаря dict(). В остальных случаях поможет модуль copy.Далее...
Декораторы функций в Python
Декораторы функций - обеспечивают способ определять специальные режимы работы для функции, обертывая их дополнительным слоем логики, реализованной в виде других функций.
class A: @staticmethod # декоратор в Python для создания статических методов def summ(x,y): return x+y a = A.summ(6,7) print a # 13
class B: # альтернативная реализация класса А def summ(x,y): return x+y summ = staticmethod(summ) b = B.summ(6,7) print b # 13
class Counter: # класс как декоратор def __init__(self, func): # принимаем в качестве параметра декорируемую функцию self.func = func # запоминаем декорируемую функцию self.calls = 0 def __call__(self, *args): # вызов декоратора, *args - аргументы декорируемой функции self.calls += 1 if self.calls >= 3: print "function summ call %s" % (self.calls,) # если функция summ была запущена 3 или больше раз return self.func(*args) @Counter def summ(a,b,c): return a+b+c print summ(5,9,2) print summ(1,7,2) print summ(4,9,3) # 16 # 10 # function summ call 3 # 16Далее...
Работа с файлами в Python
Файл - области постоянной памяти в вашем компьютере, которыми управляет операционная система. Объект файла создает функция open или file.
При работе с файлами используется буферизация и она включена по умолчанию. При буферизации данные не записываются в файл непосредственно при вызове метода записи. Они записываются, когда все действия с файлом прекращены или вызвана функция close().
f1 = open("test") # по умолчанию файл открывается в режиме r(чтение) f2 = open("test", "w") # файл открывается для записи f2 = open("test", "w", 0) # отключает буферизацию, данные сразу записываются в файл (например при вызове метода write()) f3 = open("test", "a") # файл открывается для записи в конец f4 = open("test", "a+") # файл открывается как для чтения так и для записи в конец f5 = open("test", "ab") # добавляя к режиму символ "b" мы можем работать с файлам как с двоичными данными(интерпритация символа новой строки отключена) xfile = open("test.txt") xString = xfile.read() # прочитать весь файл в строку xString = xfile.read(N) # прочитать N-байтов в строку xString = xfile.readline() # прочитать текстовую строку включая символ конца строки xList = xfile.readlines() # прочитать весь файл целиком в список строк xfile.write(xString) # записать строку в файл xfile.writelines(xList) # записать строки из списка в файл xfile.close() # закрытие файла в ручную (выполняется по окончанию работы с файлом) xfile.flush() # выталкивает выходные буферы на диск, файл остается открытым xfile.seek(N) # изменяет текущую позицию в файле для следующей операции, смещая ее на N-байтов от начала файлаПример скрипта который сам создает файлы Python c баш-строкой.
#!/usr/bin/env python # -*- coding: utf-8 -*- myfile = open("newfile.py", "w") myfile.write("#!/usr/bin/env python\n# -*- coding: utf-8 -*-") myfile.close()Скачать и сохранить файл, используя Python
#!/usr/bin/env python # -*- coding: utf-8 -*- url = "http://www.google.ru/index.html" import urllib webFile = urllib.urlopen(url) localFile = open(url.split('/')[-1], 'wb') localFile.write(webFile.read()) webFile.close() localFile.close()Далее...
Работа со строками в Python
В общем говоря над строками нельзя производить такие же действия, что и с числами. Но оператор + работает с текстом и означает сцепление строк.
#!/usr/bin/env python # -*- coding: utf-8 -*- def primer_3(): # Объявление функции primer_2() a='Я' b=' программирую на языке' f=' Python' print (a+b+f+' :)') # сцепляем строковые переменные a, # b, f и 'текст' :) def main(): primer_3() return 0 if __name__ == '__main__': main()Оператор * тоже можно использовать, но при условии, что одним из операндов будет целое число. данный оператор символизирует операцию повторения строки. Пример:
#!/usr/bin/env python # -*- coding: utf-8 -*- def primer_4(): # Объявление функции primer_4() a='Я' b=' программирую на языке' f=' Python \n' # специальный символ \n # означает переход на следующую # строку g=a+b+f print (g * 3) # распечатывам значение # переменной g 3 раза def main(): primer_4() return 0 if __name__ == '__main__': main()Здесь будут описаны особенности, расширенные возможности.Далее...
Встроенный Django сервер тормозит на Windows 7
python ./manage.py runserver 127.0.0.1:3333
http://localhost:3333/
127.0.0.1 localhost#::1 localhost
Разработка компьютерной программы
Разработка компьютерной программы.
1. Введение
2. Выбор создаваемой программы
3. Написание технического задания
4. Разработка программы
5. Создание справочной системы
6. Тестирование программы
7. Создание установочного пакета и выпуск программы
8. Обновление и улучшение программы.
1. Введение
Компьютерная программа - это механизм, благодаря которому какая либо работа пользователя упрощается или автоматизируется, перекладывая работу с человека на компьютер. Программа должна создаваться с какой-то целью, упростить какую либо работу, автоматизировать какой-то процесс, в общем, выполнять определенную задуманную работу. Программы бывают разные развлекательные, образовательные, серверные и другие. Программы существуют с того дня с которого и появились первые компьютеры, в то далекое время программы были простыми и работали очень медленно, не из-за того, что программы были криво написаны, а из-за того, что компьютеры работали очень медленно.В наше время все изменилось, компьютеры работают быстро, а вот программы не очень. Почему же так? Да все просто, в далекие прошлые временна программы разрабатывались профессионалами своего дела, а сейчас разработать программу может любой желающий. Не каждый начинающий разработчик может, создавать программу нормально, учесть все нюансы ее работы, впоследствии чего программа работает нестабильно. Данная статья покажет ту небольшую часть, которую должен пройти каждый разработчик, создавая компьютерную программу.Далее...
Востребованные на рынке языки программирования
Мысль о том, какие языки программирования лучше начинать изучать для того, чтобы гарантированно получить престижную работу, возникают у многих программистов. Дело в том, что выучить их много «на всякий случай» не получится, а они часто меняются. Как быть, чтобы всегда быть востребованным на рынке труда?
Когда ПК только появились, вопрос так остро не стоял: каждый программировал в меру сил и возможностей. В те времена еще были популярны мнения ученых, которые утверждали, что главное – уметь эффективно строить данные и создавать алгоритмы, а выбор языка – дело второе. В общем, главным был результат, а программу можно было написать на Бейсике, Паскале, Си, Фортране или ассемблере. Теперь все не так, и отделы кадров получают строгие указания действовать по шаблону – скажем, принимать лишь знающих C++ Builder, к примеру. Несмотря на то, что такая подстановка выбора некорректна. Ну да не будем о грустном, подумаем, как действовать.
По опросам специализированных изданий, сейчас наиболее перспективным языком программирования является Java. Это очевидно, связано с массовым созданием программ под мобильные платформы, с развитием web-программирования. Второй язык, как ни странно, Си «без плюсов». Не удивляйтесь, ведь Си до сих пор развивается параллельно с С++, причем с каждым годом между ними возникают все новые отличия.Далее...
С чего начинаем программировать?
Некоторые люди спрашивают, какой язык программирования следует учить в первую очередь. Существует не один ответ, но нужно учесть следующие моменты:
1. Используйте то, что используют ваши друзья. На вопрос "какую операционную систему использовать, Windows, Unix, Mac или?", Я отвечаю обычно так: «используйте то, что используют ваши друзья ". Опыт обучения с друзьями будет компенсировать любые внутренние различия между ОС или между языками программирования.
2. Вам следует выбрать будущих друзей: сообщество программистов, которое будет частью вашей жизни, если вы продолжите обучаться. Поинтересуйтесь, есть ли возрастающее количество людей на выбранном вами языке? Есть ли книги, веб-сайты и онлайн-форумы, чтобы получить ответы? Нравится ли вам люди на этих форумах? Насколько они компетентны?
3. Будьте проще. К примеру, такие языки программирования, как C + + и Java, предназначены для профессионального развития. Сложные языки - это большие команды опытных программистов, которых беспокоит эффективность созданного ими кода. В результате, подобные языки имеют много сложных деталей. А Вы начинаете с создания программы и не нужно, что-то усложнять.Далее...
Способы создания своего сайта
Различают несколько способов создания сайтов в интернете. Рассмотрим более легкий и бесплатный способ, это создание сайта на конструкторе. Онлайн конструктор сайтов предоставляет хостинг и множество других функций по созданию вашей странички, определенный объем для загружаемых файлов и всевозможные стили оформления вашей страницы. Но, как правило, на таких сервисах выделяется только поддомен, а доверие и внимательность поисковиков менее расположено к поддоменам или доменам третьего уровня. Наилучший способ это покупка домена второго уровня и помещение его на платном хостинге, включая все необходимые опции управления сайтом на этом хостинге. С постепенной раскруткой вашего сайта вам легче будет продвигать его в поисковых системах, с целью добычи трафика на свой сайт.
В этом плане есть и бесплатный вариант, но только в получении домена, а не в размещении его на хостинг. Бесплатный домен второго уровня вы можете получить в зоне dot.tk , а размещение его на хостинге, дело вашего выбора. Будет он бесплатным или на платной основе. Работа по созданию сайтов подразумевает собой сложную и трудоемкую работу, хороших навыков в программировании.
Можно обратиться к программистам или создать сайт по учебникам, и поверьте при создании сайта в интернете, без разницы каким он будет создан способом, удачная монетизация вашего трафика отблагодарит вас за ваши труды.Далее...