мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

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

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
Последняя версияСледующая версия справа и слева
python:week22 [21/01/2019 01:47] – [Классы] ybezrukovpython:week22 [21/01/2019 02:10] – [Наследование] ybezrukov
Строка 114: Строка 114:
 Обратите особое внимание на метод ''__init__''. Это специальный метод в Питоне и должен начинаться и заканчиваться двумя символами подчеркивания. Он автоматически вызывается всякий раз, когда создается новый объект. Теперь, если мы запустим этот код, то на экране будет три раза написана строка ''Сделали машину!'' Обратите особое внимание на метод ''__init__''. Это специальный метод в Питоне и должен начинаться и заканчиваться двумя символами подчеркивания. Он автоматически вызывается всякий раз, когда создается новый объект. Теперь, если мы запустим этот код, то на экране будет три раза написана строка ''Сделали машину!''
  
 +Так же метод ''__init__'' имеет аргумент с именем ''color''. Запись ''color='plain''' в описании аргументов функции задает значение аргумента по-умолчанию (т.е. значение, которое получит переменная color если мы не укажем никакого аргумента. Добавим цвета:
  
 +<code python>
 +red_car = Vehicle(color='red')
 +green_car = Vehicle(color='green')
 +blue_car = Vehicle(color='blue')
 +</code>
  
 +Если напечатать на экран значение переменной, можно заметить, что у каждого экземпляра цвет свой, хотя созданы они были по одному описанию (классу).
  
 +<code python>
 +print(red_car.color)
 +print(green_car.color)
 +print(blue_car.color)
 +</code>
 +
 +
 +Так вышло потому, что мы присвоили значение переменной ''self.color''. ''self'' это еще одно ключевое слово в Питоне, оно ссылается на конкретный экземпляр класса (объект). Всякий раз когда мы используем ''self'', мы можем изменить или прочитать данные, уникальные для объекта: красная машина - красная.
 +
 +Расширим метод ''__init__'' и добавим в него 
 +
 +<code python>
 +self.noise = 'Дрыннь!'
 +</code>
 +
 +Можно, конечно, просто напечатать на экран значение этой переменной. Сделаем немного иначе, пусть мы хотим чтобы машина ехала, и в будущем используем это в коде. Или изменим метод передвижения. Заведем функцию (метод) чтобы иметь контроль над тем как все работает. Добавим его сразу после метода ''__init__'':
 +
 +<code python>
 +def drive(self):
 +  print(self.noise)
 +</code>
 +
 +Вызвать этот метод можно написав:
 +
 +<code python>
 +red_car.drive()
 +</code>
 +
 +Всякий раз когда мы будем вызывать метод Питон будет печатать на экран звук движения машины. Вся наша программа сейчас должна выглядеть вот так:
 +
 +<code python>
 +class Vehicle:
 +  """ Этот класс описывает средство передвижения """
 +
 +  def __init__(self, color='plain'):
 +    """ задает параметры средства передвижения """
 +    print('Сделали машину!')
 +    self.color = color
 +    self.noise = 'Дрыннь!'
 +    
 +  def drive(self):
 +    print(self.noise)
 +    
 +red_car = Vehicle(color='red')
 +green_car = Vehicle(color='green')
 +blue_car = Vehicle(color='blue')
 +
 +print(red_car.color)
 +print(green_car.color)
 +print(blue_car.color)
 +
 +red_car.drive()
 +</code>
 +
 +===== Наследование =====
 +
 +Наследование это способ уменьшить дублирование и переиспользовать код. В терминах предков-потомков, наследование позволяет потомку делить общий код с предком. Создадим новый класс ElectricCar
 +
 +<code python> 
 +class ElectricCar(Vehicle):
 +  """ Электромобиль. """
 +  def charge(self):
 +    print('⚡🔋')
 +
 +electric_car = ElectricCar()
 +electric_car.charge()
 +electric_car.noise = 'Вжух!'
 +electric_car.drive()
 +
 +</code>
 +
 +Во время описания класса электромобиля мы указали имя класса Vehicle в скобках. Это инструкция Питону считать класс ElectricCar потомком или подклассом класса Vehicle. Это дает доступ до данных и методов, существующим в Vehicle.
 +
 +Электромобиль имеет так же свои методы. Он может заряжаться (этого другие машины не умеют). И издает другой звук при движении. Обратите внимание, мы не описывали метод drive() в новом классе, однако он работает и выдает верный результат.