Основы объектно-ориентированного программирования в Python: работа с классами
Основы объектно-ориентированного программирования в Python: работа с классами Занятие 3 Преподаватель: Филипп Орехов Биофак МГУ, кафедра биофизики Факультатив по программированию на языке Python для биологов
Атрибут Атрибут Атрибут + Метод Класс Классы class MyClass: """An example class"”” att = [1,2,3,4] def method(self): return(self.att) 1 принцип ООП - Инкапсуляция Атрибут = Переменная внутри класса Метод = Функция внутри класса
Классы
Плюсы ООП С помощью объектного подхода: экономим время и силы (не нужно писать один и тот же код много раз) добиваемся удобной и продуманной иерархичности данных и функций в программе
Структуры биомолекул
Файл структуры PDB
Структура программы Файл PDB – читаем построчно
Пример PDB В группе В Контакте: Файлы test.pdb и test_shuffled.pdb Листинг занятия - файл class_pdb.py
class Atom: # имя класса """Class for atoms””” # описание класса # xyz = [] # эта переменная была бы общая для всех экземпляров, def __init__(self): # а здесь перечисляются переменные, создаваемые при создании каждого нового экземпляра класса Atom # self – обращение к самому экземпляру self.xyz = [] # список с координатами атома self.type = ”CA" # тип атома (первая буква - элемент) self.chain_id = “A" # id цепи полипептида self.res_type = ”ALA” # тип аминокислотного остатка self.res_num = 0 # номер аминокислотного остатка в цепи self.num = 0 # номер атома Создаем класс для атомов
Тестируем: >> a = Atom() >> a <__main__.Atom instance at 0x1146007a0> >> a.xyz = [1,2,3] >> a.xyz [1, 2, 3] >> dir(a) # Выдает список атрибутов >> a = Atom() >> a.xyz = [1,2,3] >> a.pdb_str() 'ATOM 0 CA ALA A 0 1.000 2.000 3.000'
def AtomFromPdbLine(line): # Это функция программы, а не класса Atom. Следите за отступами! """Returns an Atom object from an atom line in a pdb file.""" atom = Atom() atom.num = int(line[6:11]) atom.type = line[12:16].strip(" ") # .strip удаляет пробелы по краям atom.res_type = line[17:20] atom.chain_id = line[21] atom.res_num = int(line[22:26]) x = float(line[30:38]) y = float(line[38:46]) z = float(line[46:54]) atom.xyz = [x, y, z] return atom Создаем экземпляр класса Atom по строке PDB >> a = AtomFromPdbLine(“ATOM 0 CA ALA A 0 1.000 2.000 3.000”) >> a.res_type 'ALA'
class Molecule: """Class for molecules””” # описание класса def __init__(self, pdb=""): # Функция инициирования может принимать аргументы, здесь – имя файла pdb self.id = '' # название молекулы self._atoms = [] # в этом списке будем хранить экземпляры атомов if pdb: # если задано имя файла со структурой self.read_pdb(pdb) # то прочитать его с помощью ф-ции, которую мы напишем чуть позже Создаем класс для молекулы
def erase_atom(self, atom_num): # удаляем атом с заданным номером for atom in self._atoms: # итерируем по списку с атомами if atom.num == atom_num: # если номер атома равен заданному self._atoms.remove(atom) # удаляем его из списка атомов del atom # и удаляем этот экземпляр класса Atom return # выходим из цикла, т.к. нашли нужный атом Добавляем в класс полезные методы
def write_pdb(self, pdb): f = open(pdb, 'w') # открываем файл для записи n_atom = 0 # счетчик атомов for atom in sorted(self._atoms, cmp=cmp_atom): n_atom += 1 atom.num = n_atom # перенумеруем атомы с 1 f.write(atom.pdb_str() + '\n') f.close() Добавляем метод записи в файл pdb # итерируем по сорированному списку, правило сортировки задается ф-цией cmp_atom
def center(self): # надо найти средние координаты x, y и z # Можно использовать цикл: for i in self._atoms: # итерируем по списку атомов x_c += i.xyz[0] # суммируем координату x x_c = x_c / self.n_atom() # делим на количество атомов # а можно использовать List comprehensions y_c = sum([i.xyz[1] for i in self._atoms]) / self.n_atom() # или лямбда-функцию в связке с map() z_c = sum(map(lambda i: i.xyz[2], self._atoms)) / self.n_atom() return [x_c, y_c, z_c] Добавляем метод расчета центра молекулы Map(func, list) – применяет функцию func к каждому элементу списка list
>> a = Molecule(“test.pdb”) >> a._atoms[1].xyz [76.77, 63.545, 49.23] >> a.n_atom() 128 >> a.erase_atom(10) >> a.n_atom() 127 >> a.insert_atom(a.atom(5)) >> a_n_atom() 128 >> a.center() [73.42757812500003, 59.273328125000006, 48.424867187499984] >> b = Molecule() >> b.read_pdb(“test_shuffled.pdb”) >> b.write_pdb(“test_ordered.pdb”) (In unix shell: >> diff test.pdb test_ordered.pdb)
Домашнее задание – написать класс для работы с последовательностями нуклеотидов в fasta-формате
22374-lesson3_with_comments.ppt
- Количество слайдов: 17