Занятие 7. Классы. 18-19 октября ФББ МГУ имени М.В.Ломоносова 2013 год "Простые" объекты Строчку текста можно сохранить в переменной типа str и потом делать с ней простейшие действия: • записать несколько раз подряд; • дописать к ней другие строчки; • убрать определенные символы с конца и начала; • вывести строку на экран и т.д. и т.п. a = b = foo foo e = 1 "ABCD" "EEEE" = 3 * a = a + b + " " foo.strip(" ") print e Но что делать, если нужно сохранить в памяти информацию о более сложном объекте и потом работать с ним?! …например, белок id_RefSeq = "YP_00000001.1" description = "hypothetical protein" sequence = "MAYRTFGTYHYTR..." 3 переменные, и ни в одной из них не хранится информация о белке как таковом: только все вместе они описывают белок 2 Жизнь без классов Цель: сохранить данные о конкретной кошке в памяти Кошка: Имя Возраст Длина хвоста Способ 1А: переменные cat_name = "Kitty" cat_age = 1.5 cat_tale_len = 10 Переменные, по сути хранящие части информации о чем-то одном, разнесены (и в коде, и логически); есть возраст, имя и длина, а кошки-то и нету! Способ 1Б: список x = ("Kitty", 1.5, 10) cat_age = x[1] Нужно всегда помнить, под каким номером в списке хранится что. Легко перепутать возраст с длиной хвоста. 3 Класс Кошка: Цель: сохранить данные о конкретной кошке в памяти 4 Имя Возраст Длина хвоста Способ 2: задание класса двоеточие class Cat: name = "Noname" отступ age = 0 tale_len = 0 1) В одном месте кода ясно прописано, какие свойства задают кошку; это легко изменить, если понадобится обращение к x = Cat() свойству класса x.name = "Kitty" x.age = 1.5 x.tale_len = 10 2) В переменной теперь сохраняется реальный объект, к свойствам которого, прописанным выше, можно обратиться Методы класса Кошка: Имя Возраст Длина хвоста + умение сообщать свое имя на экран class Cat: name = "Noname" по age = 0 умолчанию tale_len = 0 def miau(self): print "Miaaaoooo!" print "My name is %s" % self.name x = Cat() x – конкретный экземпляр (объект) класса x.name = "Kitty" Тонкость: первый аргумент функции, принадлежащей классу – всегда тот объект, x.age = 1.5 который ее вызвал; через него можно x.tale_len = 10 обращаться к свойствам этого объекта. Но при вызове функции это не указывается! x.miau() 5 6 Словарик Имя класса class Cat: переменные-члены класса name = "Noname" (data members) age = 0 или свойства класса (class attributes) tale_len = 0 def miau(self): print "Miaaaoooo!" print "My name is %s" % self.name В переменной x сохранен новый объект, экземпляр (instance) класса x = Cat() x.miau() Вызов функции класса данным объектом Функция miau() прописана выше. А где функция Cat()?! функция-член класса (member function) или метод класса (class method) Инициализирующая функция class Cat: name = "Noname" age = 0 tale_len = 0 def miau(self): print "Miaaaoooo!" print "My name is %s" % self.name def __init__(self, n, a, t): Вызывается, self.name = n когда мы пишем self.age = a x = Cat() self.tale_len = t x = Cat("Kitty", 1.5, 10) x.miau() 7