Kodomo

Пользователь

Учебная страница курса биоинформатики,
год поступления 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 wink(self):
   2                          self.canvas.itemconfig(self.eye1, state='hidden')
   3                          self.canvas.itemconfig(self.eye2, state='hidden')
   4                          root.after(delay, self.unwink)
   5 
   6              def unwink(self):
   7                          self.canvas.itemconfig(self.eye1, state='normal')
   8                          self.canvas.itemconfig(self.eye2, state='normal')

Еще мы хотим, чтобы при щелчке мыши на рожицу она исчезала. Для этого нужно, чтобы рожица а) умела определить, попал ли в нее курсор б) умела исчезнуть

   1             def contains(self, x, y):
   2                          if (x - self.x)**2 + (y - self.y)**2 <= self.r**2:
   3                                     return True
   4                          return False
   5 
   6             def delete(self):
   7                          self.canvas.delete(self.face)
   8                          self.canvas.delete(self.eye1)
   9                          self.canvas.delete(self.eye2)

Теперь мы можем создать много рожиц, заставить их моргать, исчезать и появляться по нажатию мышки и т.п.

   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()