Библиотека сайта rus-linux.net
Р.Сузи. Спецкурс "Язык Python и его приложения"
Практическое занятие 2.
Занятие посвящено модулям и классам.
Код нетривиальных программ принято располагать в нескольких модулях.
Стандартные модули Python находятся (в Linux) в каталоге
/usr/lib/python*
(где на месте звездочки - версия Python, например 1.5 или 2.2)
Модуль - это обычная программа на Python, используемая из других модулей.
Модули подгружаются в Python-программу по оператору import
или from-import. Поиск модулей производится в каталогах, указанных
в переменной sys.path:
>>> import sys
>>> print sys.path
['', '/usr/lib/python1.5/', '/usr/lib/python1.5/plat-linux-i386',
'/usr/lib/python1.5/lib-tk', '/usr/lib/python1.5/lib-dynload',
'/usr/lib/python1.5/site-packages']
В первую очередь поиск идет в текущем каталоге.
Наберите следующие файлы в тектовом редакторе:
********************** ПРИМЕЧАНИЕ ***************************
Для копирования содержимомго файлов удобно использовать
следующий метод:
1. Скопируйте выделенный текст в клипбоард
2. В консоли UNIX:
- Подать команду vi (текстовый редактор vi)
- Нажать i для перехода в режим вставки
- Вставить содержимое клипбоарда, нажав правую кнопку мыши
- Нажать Esc и Z Z для выхода с сохранением
3. Применить команду
chmod +x файл.py
для установки признака исполняемости
4. Запустить программу можно командой
./файл.py
************************************************************
--- A.py ---
#!/usr/bin/python
"""Пример модуля"""
def a(x):
return "a: " + str(x)
# End of A.py
--- M.py ---
#!/usr/bin/python
"""Главный модуль"""
import A
print A.a("proba")
# End of M.py
И запустите главный модуль:
$ chmod +x M.py
$ ./M.py
a: proba
Заметьте, что в каталоге образовался новый файл: A.pyc
$ ls A.*
A.py A.pyc
В этом файле - скомпилированный в код Python-машины модуль A.
Для следующего упражнения понадобится два соединения с UNIX-машиной.
Измените главную программу так:
#!/usr/bin/python
"""Главный модуль"""
import time
import A
from A import a
while 1:
print A.a("proba"), a("proba2")
time.sleep(2)
reload(A)
# End of M.py
И запустите его на исполнение на одной консоли:
$ ./M.py
a: proba a: proba2
a: proba a: proba2
На другой консоли отредактируйте модуль A.py
следующим образом:
--- A.py ---
#!/usr/bin/python
"""Пример модуля"""
def a(x):
return "a2: " + str(x)
# End of A.py
Вот что должно получиться:
$ ./M.py
a: proba a: proba2
a: proba a: proba2
a: proba a: proba2
a: proba a: proba2
a2: proba a: proba2
a2: proba a: proba2
a2: proba a: proba2
a2: proba a: proba2
a2: proba a: proba2
Попробуйте тоже самое со следующим главным модулем:
#!/usr/bin/python
"""Главный модуль"""
import time
import A
from A import a
while 1:
print A.a("proba"), a("proba2")
time.sleep(2)
reload(A)
from A import a
# End of M.py
Другой путь агрегации данных и операций, который хорошо дополняет
модульный подход - описание классов объектов.
Простейший класс описать очень легко:
--- C.py ---
#!/usr/bin/python
"""Пример программы с классом"""
class S:
""" Простейший класс """
pass
s = S()
print S
print s
# End of C.py
Запустите программу.
Немного усложним наш пример, добавив конструктор __init__()
и метод __str__():
#!/usr/bin/python
"""Пример программы с классом"""
class S:
""" Класс посложнее """
def __init__(self, x=0):
self.x = x
def __str__(self):
return "S(%s)" % self.x
s = S()
print S
print s
# End of C.py
Оператор print использует __str__() для преобразования
объекта к строке. Тот же метод использует встроенная
функция str(). Таким образом, str(s) == s.__str__().
Теперь нетривиальный пример:
--- sig_poly.py ---
#!/usr/bin/python
def m_fly(self):
return "Я летаю."
def m_swim(self):
return "Я плыву."
def m_sing(self):
return "Я пою."
class Everybody:
def i_am(self):
return "Я %s." % self.name
def __getattr__(self, attname):
def cant_do(self=None, action=attname):
return "Я не умею %s." % action
return cant_do
class Fish(Everybody):
name = "Рыба"
swim = m_swim
class Mermaid(Everybody):
name = "Русалка"
sing = m_sing
swim = m_swim
class Bird(Everybody):
name = "Птица"
fly = m_fly
sing = m_sing
class Man(Everybody):
name = "Человек"
sing = m_sing
f = Fish(); r = Mermaid(); b = Bird(); m = Man()
print f.i_am(), f.swim(), f.sing(), f.fly()
print r.i_am(), r.swim(), r.sing(), r.fly()
print b.i_am(), b.swim(), b.sing(), b.fly()
print m.i_am(), m.swim(), m.sing(), m.fly()
print "Людей научили плавать."
Man.swim = m_swim
print m.i_am(), m.swim(), m.sing(), m.fly()
# End of sig_poly.py
Дополните
class Everybody:
следующим методом:
def __str__(self):
return "Я %s." % self.name
Теперь можно делать так:
print f, r, b, m
Дело в том, что метод __str__ - специальный. Его вызывает
оператор print или функция str() для получения представления объекта в виде строки.
