Учебная страница курса биоинформатики,
год поступления 2012
Классы
Идея классов заключается в следующем. Мир состоит из объектов, которые имеют некоторые характеристики (атрибуты). Например, человек характеризуется именем, ростом, весом, цветом глаз. Если бы мы описывали систему «мир людей», было бы удобно хранить информацию, относящуюся к одному объекту - человеку, в одном месте, а не в разных списках (для имен, для ростов и т.п.). Класс – это по сути шаблон, новый тип данных, который задает, какие у объекта этого типа есть свойства и что они умеют делать.
В питоне можно и самому создавать объекты с каким-либо набором переменных (для этого и нужны классы), которые тоже придумываем мы. Эти переменные называют атрибутами, а функцию внутри объекта – методом. Объект это отдельный представитель класса, класс же в свою очередь – описание принадлежащих объектам методов. Для создание в классе новых объектов класс вызывают как функцию(конструктор класса). Для примера опишем класс Face, который представляет собой рожицу. У каждого объекта этого класса есть глазки и он умеет моргать ими Каждая рожица знает координаты своего центра, радиус, цвет и т.п.
1 import Tkinter
2 import random
3 import time
4
5 canvas_size = 500
6 r = 20
7 delay = 100
8
9 class Face:
10 colors = ["red","orange","yellow","green","blue","cyan","magenta","light blue"]
11 def __init__(self, canvas, x = None, y = None):
12 self.canvas = canvas
13 self.r = r
14 if x == None or y == None:
15 self.x = random.randint(self.r, canvas_size - self.r)
16 self.y = random.randint(self.r, canvas_size - self.r)
17 else:
18 self.x = x
19 self.y = y
20
21 self.color = random.choice(self.colors)
22 self.eye_color = "black"
Метод __init__ это особый метод, который называется конструктором. В нем описывают все действия, которые выполняются при создании объекта. В частности, в нем задают значения атрибутов. Приставка self. говорит о том, что это атрибут объекта. У каждой рожицы есть свой x, свой y, свой r и т. п.
Теперь зададим, как наша рожица будет выглядеть (рисовать себя):
1 self.create_face()
2 self.create_eyes()
3
4 def create_face(self):
5 x1 = self.x - self.r
6 x2 = self.x + self.r
7 y1 = self.y - self.r
8 y2 = self.y + self.r
9 self.face = self.canvas.create_oval(x1, y1, x2, y2, fill=self.color)
10
11 def create_eyes(self):
12 eye_y1 = self.y - self.r/4
13 eye_y2 = self.y + self.r/4
14 eye1_x1 = self.x - self.r *3/4
15 eye1_x2 = self.x - self.r/4
16 eye2_x1 = self.x + self.r/4
17 eye2_x2 = self.x + self.r*3/4
18 self.eye1 = canv.create_oval(eye1_x1, eye_y1, eye1_x2, eye_y2, fill = self.eye_color)
19 self.eye2 = canv.create_oval(eye2_x1, eye_y1, eye2_x2, eye_y2, fill = self.eye_color)
Как мы договорились, наша рожица умеет моргать. Для того, чтобы моргнуть, мы будем на время «прятать» глаза рожицы.
Еще мы хотим, чтобы при щелчке мыши на рожицу она исчезала. Для этого нужно, чтобы рожица а) умела определить, попал ли в нее курсор б) умела исчезнуть
Теперь мы можем создать много рожиц, заставить их моргать, исчезать и появляться по нажатию мышки и т.п.
1 def mousePressed(event):
2 x = canv.canvasx(event.x)
3 y = canv.canvasy(event.y)
4 for f in faces:
5 if f.contains(x, y):
6 f.delete()
7 faces.remove(f)
8 return
9 faces.append(Face(canv, x, y))
10
11 def rnd_wink():
12 face = random.choice(faces)
13 face.wink()
14 root.after(delay, rnd_wink)
15
16 root=Tkinter.Tk()
17 canv = Tkinter.Canvas(root, width=canvas_size, height=canvas_size, bg="white")
18 canv.pack()
19 faces=[]
20 for i in range(20):
21 faces.append(Face(canv))
22 rnd_wink()
23 canv.bind('<ButtonPress>',mousePressed)
24 root.mainloop()