Kodomo

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

Задание 3: Классы и функции.

Так как мы планируем создать модель солнечной системы, то пора заняться описанием этой модели.

Но для начала разберём пару примеров попроще..

Функции.

Функция – это набор действий. Когда мы хотим выполнить эти действия,мы вызываем функцию.

При вызове любой функции происходит передача аргументов, которая заключается в том, что передаваемые значения присваиваются аргументам функции.

Переменные, создаваемые в функции, являются локальными, и они не видны снаружи.

Чтобы вызвать функцию необходимо прописать её, как, например, иллюстрирует строка 6 примера №1.

Командой def мы объявляем функцию.

После того, как мы объявим функцию, необходимо ставить знак : .

На каждой строке, описывающей функцию и её результат ставим отступ.

По окончанию нажимаем enter и последующую команду начинаем начинаем с >>> .

Простые примеры.

Пример 1.

   1 >>> def a(c):
   2 ...    c.append(1)
   3 ...    return len(c)
   4 ...
   5 >>> c=[1,2]
   6 >>> a(c)
   7 3
   8 >>> c
   9 [1,2,1]

Чем отличаются print от return?

Print - непосредственно печает то, что просим; но результат не хранит.

Оператор return - возвращает значение функции и выходит из неё. Но он хранит результат.

Если функция не завершается командой return, то по умолчанию выполняется команда return None.

Пример 2.

Демонстрирует, что функция может получать несколько аргументов.

   1 >>> def a(x,y):
   2 ...    b=x+1
   3 ...    return b*y
   4 ...
   5 >>> a(1,2)
   6 4
   7 >>> a(3,5)
   8 20

Пример 3.

Демонстрирует, что можно использовать значения любых типов: как списки, так и числовые значения.

   1 >>> def a(b,c):
   2 ...     return b[c]
   3 >>> b=1
   4 >>> c=[1,2,3]
   5 >>> a(c,b)
   6 2

Подтвердим результат изображением пошаговой работы команд:

digraph pass_args {
 subgraph cluster_Caller {
  label="toplevel"
  labeljust="l"
  b -> v1
  c -> v2
  v1 [ label="1" ]
  v2 [ label="[1, 2, 3]" ]
 }
 subgraph cluster_Function {
  label="in function a"
  labeljust="l"
  b1 -> v2
  c1 -> v1
  b1 [ label="b" ]
  c1 [ label="c" ]
 }
}

Классы и объекты.

Изначально объектами в наших примерах выступали числа или списки.

Мы можем сами придумывать объекты и описывать их определённым набором переменных.

Эти переменные называются атрибутами.Функцию внутри объекта принято называть методом.

Объекты создаются как представители класса. Класс – описание методов, принадлежащих нашим объектам.

Чтобы создать новый объект класса, как мы это сделали в 4 строке этого примера, мы вызываем класс как функцию.

Эта функция, с помощью которой мы создаём новый объект, называется конструктором класса.

Мы хотим описать класс для планет (класс Planet). У объектов класса Planet нет методов и есть атрибуты: название, радиус, масса планеты и т.д.

Класс Planet. Версия 1.

   1 >>> class Planet(object):
   2 ...   pass
   3 
   4 >>> earth=Planet()
   5 >>> earth.r=6371.0
   6 >>> sun=Planet()
   7 >>> sun.r=695500.0

Команда pass ничего не делает. Её можно употреблять где угодно, где питон от нас ожидает каких-то содержательных строк, а мы ему ничего не хотим говорить. В данном случае мы её говорим здесь потому, что мы не хотим делать для нашего класса методов.

В первой строке мы указываем, что класс Planet наследуется от объекта.

Оформление классов и функций представляется в виде блоков, т.е.:

  • Как и при записи функции, при записи класса необходимо ставить знак : .

  • На последующих строках описания класса ставим отступы аналогично записи функций.

Операция "точка" выполняет следующее: она позволяет обратиться к атрибуту объекта.

Для описания класса Planet, нам необходимо сначала задать класс Vector.

Класс Vector неоходим нам для описания местоположения планет.

Класс Vector. Первая версия.

   1 >>> class Vector(object):
   2 ...     def add(self,other):
   3 ...             result=Vector()
   4 ...             result.x=self.x+other.x
   5 ...             result.y=self.y+other.y
   6 ...             return result
   7 ...
   8 >>> a=Vector()
   9 >>> a.x=1
  10 >>> a.y=4
  11 >>> b=Vector()
  12 >>> b.x=6
  13 >>> b.y=4
  14 >>> c=a.add(b)
  15 >>> c.x
  16 7
  17 >>> c.y
  18 8

Метод синтаксически описывается также как и любая функция в питоне.

В качестве первого аргумента при вызове метода ему передаётся объект, на котором вызван метод.

По этой причине первый аргумент метода традиционно принято называть self.

Рассмотрим следующий пример:

   1 >>> class A(object):
   2 ...   def f(self,x,y):
   3 ...      return x,y
   4 
   5 >>> a=A()
   6 >>> a.f(1,2)
   7 3
   8 >>> A.f(a,1,2)
   9 3

Строки 6 и 8 являются эквивалентными, чтобы получить результат необходимо прописать либо строку 6, либо 8.

Данный пример иллюстрирует, что доставая метод из объекта, мы подставляем его на место аргумента self.

Первым аргументом метода объекта всегда выступает сам объект.

Класс Vector. Вторая версия.

Когда мы работаем с векторами, хочется работать с ними так, как нам привычно. Например, хочется писать не c = a.add(b), а c = a + b. Питон позволяет нам это сделать:

   1 >>> class Vector(object):
   2 ...    def __add__(self, other):
   3 ...        result=Vector()
   4 ...        result.x=self.x+other.x
   5 ...        result.y=self.y+other.y
   6 ...        return result
   7 >>> a=Vector()
   8 >>> a.x=1
   9 >>> a.y=2
  10 >>> b=Vector()
  11 >>> b.x=3
  12 >>> b.y=99
  13 >>> c=a+b
  14 >>> c.x
  15 4
  16 >>> c.y
  17 101

При записи функций равноценными считаются следующие:

Класс Vector. Третья версия.

Однако описывать этот класс таким образом было бы неудобно. Поэтому следует описать класс немного иначе.

Если у класса есть метод __init__, то ему передаются все аргументы конструктора класса.

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

   1 >>> class Vector(object):
   2 ...    def __init__(self,x,y):
   3 ...       self.x=x
   4 ...       self.y=y
   5 ...    def __add__(self,other):
   6 ...       result=Vector(self.x+other.x,self.y+other.y)
   7 ...       return result
   8 ...    def __repr__(self):
   9 ...       return "Vector(%s,%s)"%(self.x,self.y)
  10 >>> a=Vector(1,2)
  11 >>> b=Vector(5,6)
  12 >>> c=a+b
  13 >>> print c
  14 Vector(6,8)

В данном примере также приведено в пример использование функции __repr__, которая определяет, в каком виде print распечатывает нам наш объект.

Для того, чтобы описать класс Planet, нам потребуется ввести следующие параметры: название планеты, её местоположение,скорость вращения, радиус и массу.

Класс Planet. Версия 2.

   1 >>> class Planet(object):
   2 ...  def __init__(self,name,position,velocity,radius,mass):
   3 ...    self.name=name
   4 ...    self.position=position
   5 ...    self.velocity=velocity
   6 ...    self.radius=radius
   7 ...    self.mass=mass

О документации питона

Напоминаю в очередной раз, как добывать документацию: