Kodomo

User

Учебная страница курса биоинформатики,
год поступления 2012

Классы

Идея классов заключается в следующем. Мир состоит из объектов, которые имеют некоторые характеристики (атрибуты). Например, человек характеризуется именем, ростом, весом, цветом глаз. Если бы мы описывали систему «мир людей», было бы удобно хранить информацию, относящуюся к одному объекту - человеку, в одном месте, а не в разных списках (для имен, для ростов и т.п.). Класс – это по сути шаблон, новый тип данных, который задает, какие у объекта этого типа есть свойства и что они умеют делать.

В питоне можно и самому создавать объекты с каким-либо набором переменных (для этого и нужны классы), которые тоже придумываем мы. Эти переменные называют атрибутами, а функцию внутри объекта – методом. Объект это отдельный представитель класса, класс же в свою очередь – описание принадлежащих объектам методов. Для создание в классе новых объектов класс вызывают как функцию(конструктор класса). Для примера опишем класс Face, который представляет собой рожицу. У каждого объекта этого класса есть глазки и он умеет моргать ими :-) Каждая рожица знает координаты своего центра, радиус, цвет и т.п.

import Tkinter
import random
import time

canvas_size = 500
r = 20
delay = 100

class Face:
             colors = ["red","orange","yellow","green","blue","cyan","magenta","light blue"]
             def __init__(self, canvas, x = None, y = None):
                         self.canvas = canvas
                         self.r = r
                         if x == None or y == None:
                                    self.x = random.randint(self.r, canvas_size - self.r)
                                    self.y = random.randint(self.r, canvas_size - self.r)
                         else:
                                    self.x = x
                                    self.y = y

                         self.color = random.choice(self.colors)
                         self.eye_color = "black"

Метод __init__ это особый метод, который называется конструктором. В нем описывают все действия, которые выполняются при создании объекта. В частности, в нем задают значения атрибутов. Приставка self. говорит о том, что это атрибут объекта. У каждой рожицы есть свой x, свой y, свой r и т. п.

Теперь зададим, как наша рожица будет выглядеть (рисовать себя):

                         self.create_face()
                         self.create_eyes()

             def create_face(self):
                         x1 = self.x - self.r
                         x2 = self.x + self.r
                         y1 = self.y  - self.r
                         y2 = self.y  + self.r
                         self.face = self.canvas.create_oval(x1, y1, x2, y2, fill=self.color)

             def create_eyes(self):
                         eye_y1 = self.y  - self.r/4
                         eye_y2 = self.y  + self.r/4
                         eye1_x1 = self.x - self.r *3/4
                         eye1_x2 = self.x - self.r/4
                         eye2_x1 = self.x + self.r/4
                         eye2_x2 = self.x + self.r*3/4
                         self.eye1 = canv.create_oval(eye1_x1, eye_y1, eye1_x2, eye_y2, fill = self.eye_color)
                         self.eye2 = canv.create_oval(eye2_x1, eye_y1, eye2_x2, eye_y2, fill = self.eye_color)

Как мы договорились, наша рожица умеет моргать. Для того, чтобы моргнуть, мы будем на время «прятать» глаза рожицы.

            def wink(self):
                         self.canvas.itemconfig(self.eye1, state='hidden')
                         self.canvas.itemconfig(self.eye2, state='hidden')
                         root.after(delay, self.unwink)

             def unwink(self):
                         self.canvas.itemconfig(self.eye1, state='normal')
                         self.canvas.itemconfig(self.eye2, state='normal')

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

            def contains(self, x, y):
                         if (x - self.x)**2 + (y - self.y)**2 <= self.r**2:
                                    return True
                         return False

            def delete(self):
                         self.canvas.delete(self.face)
                         self.canvas.delete(self.eye1)
                         self.canvas.delete(self.eye2)

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

def mousePressed(event):
             x = canv.canvasx(event.x)
             y = canv.canvasy(event.y)
             for f in faces:
                         if f.contains(x, y):
                                    f.delete()
                                    faces.remove(f)
                                    return
             faces.append(Face(canv, x, y))

 def rnd_wink():
             face = random.choice(faces)
             face.wink()
             root.after(delay, rnd_wink)

 root=Tkinter.Tk()
 canv = Tkinter.Canvas(root, width=canvas_size, height=canvas_size, bg="white")
 canv.pack()
 faces=[]
 for i in range(20):
             faces.append(Face(canv))
 rnd_wink()
 canv.bind('<ButtonPress>',mousePressed)
 root.mainloop()

2012/4/Python/13/Record (last edited 2014-04-28 20:28:20 by stavrovskaya)