9.50M
Категория: ПрограммированиеПрограммирование

Объектно-ориентированное программирование. Классы

1.

Объектно-ориентированное
программирование. Классы

2.

ООП. Классы
Создание классов

3.

Как создать собственный объект?
Для этого необходимо знать:
➔ Какой этот объект? Какие данные его описывают?
➔ Что умеет делать этот объект? Какие действия он выполняет?
Порассуждаем на примере всем знакомого объекта

4.

Чтобы создать собственный объект,
нужно описать его данные и действия.
➢ есть колеса
➢ есть фары
➢ есть двери
➢ умеет ездить
➢ заводится
➢ в неё могут
сесть люди
— это
машина
➢ есть зеркала

5.

Класс
— единое название для многих объектов;
— в программировании: общее описание того, как должны
быть устроены эти объекты.
ЭТО — машина
Объект
Класс объекта
Знания про все такие объекты

6.

Экземпляр класса
— это объект, созданный по описанию,
запрограммированному в классе.
Экземпляр
Класс
класса

7.

Экземпляр класса
— это объект, созданный по описанию,
запрограммированному в классе.
экземпляр = Класс()
Объект получает всё, что
знает и умеет класс.
Свойства
Методы
Описываем класс:
Создаём
объект
Свойства
Методы

8.

Конструктор
— это метод, который автоматически вызывается при
создании объекта. Он создаёт экземпляр класса.
Часто в конструкторе задаются свойства создаваемого объекта.

9.

Создание класса
class (в англ. — «класс») — команда, создающая класс.
self (в англ. — «сам, себя») — текущий объект класса.
class
Имя класса
():
def __init__(self,
self.
Свойство
Данные
):
Данные
= name
def print_info(self):
print('Информация об объекте:', self. Свойство
Экземпляр
=
Имя класса
(
Свойство
)
)

10.

Создание класса
class (в англ. — «класс») — команда, создающая класс.
self (в англ. — «сам, себя») — текущий объект класса.
class
Имя класса
def __init__(self,
self.
Команда, с которой
начинается описание
класса.
():
Свойство
Данные
):
Данные
= name
def print_info(self):
print('Информация об объекте:', self. Свойство
Экземпляр
=
Имя класса
(
Свойство
)
)

11.

Создание класса
class (в англ. — «класс») — команда, создающая класс.
self (в англ. — «сам, себя») — текущий объект класса.
class
Имя класса
():
def __init__(self,
self.
Свойство
Данные
Конструктор с
процессом создания
экземпляра класса.
):
Данные
= name
def print_info(self):
print('Информация об объекте:', self. Свойство
Экземпляр
=
Имя класса
(
Свойство
)
)

12.

Создание класса
class (в англ. — «класс») — команда, создающая класс.
self (в англ. — «сам, себя») — текущий объект класса.
class
Имя класса
():
def __init__(self,
self.
Свойство
Данные
):
Данные
= name
def print_info(self):
print('Информация об объекте:', self. Свойство
Экземпляр
=
Имя класса
(
Свойство
)
)
Метод
класса
(может
быть
любой!)

13.

Создание класса
class (в англ. — «класс») — команда, создающая класс.
self (в англ. — «сам, себя») — текущий объект класса.
class
Имя класса
():
def __init__(self,
self.
Свойство
Данные
):
Данные
= name
def print_info(self):
print('Информация об объекте:', self. Свойство
Экземпляр
=
Имя класса
(
Свойство
)
)
Создание экземпляра
класса с указанным
свойством.

14.

Текстовый квест «Рыцарь и дракон»
Суть квеста:
➔ Рыцарь направляется в логово дракона,
чтобы сразиться с ним и забрать его
сокровища.
➔ По пути в логово встречаются разбойники.
Рыцарь может проехать мимо или вступать
с ними в схватку.
➔ За победу над разбойником рыцарь
получает опыт. Его броня становится
крепче, а удар — сильнее. Но в схватке
можно и погибнуть и не добраться до
дракона.

15.

Текстовый квест «Рыцарь и дракон»
Что будем делать?
➔ Создадим класс Hero («Персонаж»).
➔ Опишем в конструкторе поля класса.
➔ Зададим методы класса.
➔ Создадим экземпляры класса Hero:
рыцарь, разбойники, дракон.
➔ Запрограммируем «поединки» между
экземплярами класса.

16.

Класс Hero
Запрограммируем класс с полями и методами, изложенными в mind map.
Имя персонажа
Поля класса
(свойства)
Уровень здоровья
Класс брони
Сила удара
Оружие
Класс Hero
Печать информации о персонаже
Методы класса
Нанести удар по врагу

17.

Класс Hero: конструктор и печать данных
При создании экземпляра класса должен создаваться персонаж с
указанными свойствами.
Здоровье: 50
Ричард
Броня: 25
Оружие: меч
Сила удара: 20

18.

class Hero():
def __init__(self, name, health, armor, power, weapon):
self.name = name
self.health = health #число
self.armor = armor #число
self.power = power #число
self.weapon = weapon #строка
def print_info(self):
print('Поприветствуйте героя ->', self.name)
print('Уровень здоровья:', self.health)
#продолжите самостоятельно
knight = Hero('Ричард', 50, 25, 20, 'меч')
knight.print_info()

19.

Класс Hero: метод strike()
Создадим два экземпляра класса и запрограммируем нанесение удара
одним героем по другому.
Ричард
Хелен
Здоровье: 50
Здоровье: 20
Оружие: меч
Оружие: лук
Броня: 25
Броня: 5
Сила удара: 20
Сила удара: 5

20.

Класс Hero: метод strike()
Создадим два экземпляра класса и запрограммируем нанесение удара
одним героем по другому.
Ричард
Хелен
Здоровье: 50
Здоровье: 5
Оружие: меч
Оружие: лук
Броня: 25
Броня: 0
Сила удара: 20
Сила удара: 5
Удар!

21.

Добавим в класс метод, атакующий врага.
Сперва урон наносится по броне, а когда её не остаётся, то по здоровью.
def strike(self, enemy):
print(
Укажем как параметр объект Hero,
по которому наносится удар.
'-> УДАР! ' + self.name + ' атакует ' + enemy.name +
' с силой ' + str(self.power) + ', используя ' + self.weapon + '\n')
enemy.armor -= self.power
if enemy.armor < 0:
enemy.health += enemy.armor
enemy.armor = 0
Урон наносится по броне.
Если брони не осталось,
то вычитаем остальное из
здоровья.
print(
enemy.name + ' покачнулся(-ась).\nКласс брони упал до '
+ str(enemy.armor) + ', а уровень здоровья до '
+ str(enemy.health) + '\n')
Символ переноса строки

22.

class Hero():
def __init__(self, name, health, armor, power, weapon):
Тело метода
def print_info(self):
Тело метода
def strike(self, enemy):
Тело метода
knight = Hero('Ричард', 50, 25, 20, 'меч')
knight.print_info()
rascal = Hero('Хелен', 20, 5, 5, 'лук')
rascal.print_info()
knight.strike(rascal)

23.

Задачи:
➔ Создайте класс Hero с перечисленными полями и методами.
➔ Создайте два экземпляра класса: рыцаря и разбойника.
➔ Потренируйтесь «наносить удары» методом strike():

Правило поединка: удары наносятся по очереди.

24.

Игра-квест «Рыцарь и дракон»
Рыцарь начинает путь
Пусть на пути у рыцаря
встретится коварный
разбойник Питер,
вооружённый ножом.
Рыцарь встречает
Разбойника и начинает бой
нет
да
Погиб Разбойник?
Рыцарь повышает класс
брони и силу удара
Рыцарь встречает Дракона и
начинает бой
ПРОИГРЫШ
нет
ПРОИГРЫШ
Погиб
Дракон?
да
ПОБЕДА

25.

Игра-квест «Рыцарь и дракон»
Рыцарь начинает путь
Рыцарь встречает
Разбойника и начинает бой
нет
ПРОИГРЫШ
да
Погиб Разбойник?
Рыцарь повышает класс
брони и силу удара
Возможно, если
Рыцарь стал
сильнее в схватке
с разбойником.
Рыцарь встречает Дракона и
начинает бой
нет
ПРОИГРЫШ
Погиб
Дракон?
да
ПОБЕДА

26.

Шаг 1 — сохраним Hero как модуль
➔ Оставьте в уровне только класс Hero.
Сохраните его как модуль Hero.
➔ В следующем уровне подключите
модуль Hero, создайте персонажей
Рыцарь, Разбойник и Дракон, и
напечатайте информацию о них.

27.

Шаг 1 — сохраним Hero как модуль
➔ Оставьте в уровне только класс Hero.
Сохраните его как модуль Hero.
➔ В следующем уровне подключите
модуль Hero, создайте персонажей
Рыцарь, Разбойник и Дракон и
напечатайте информацию о них.
from hero import Hero
knight = Hero('Ричард', 50, 25, 20, 'меч')
rascal = Hero('Питер', 20, 5, 5, 'нож')
dragon = Hero('Дракон', 100, 25, 10, 'пламя')
#печать данных дополните самостоятельно

28.

Шаг 2 — создадим метод fight()
Суть метода:
❖ Участники схватки наносят друг другу удары (метод strike()),
пока не останется жив только один из них.
Как запрограммировать такой метод?
Можно ли вызывать метод strike() в методе fight()?

29.

Дополним класс Hero методом fight()
В его теле будем использовать метод strike().
Имя персонажа
Поля класса
(свойства)
Уровень здоровья
Класс брони
Сила удара
Оружие
Класс Hero
Печать информации о персонаже
Методы класса
Нанести удар по врагу
Сразиться с врагом

30.

Дополним класс Hero методом fight()
В его теле будем использовать метод strike().
def fight(self, enemy):
while self.health > 0 and enemy.health > 0:
Пока уровень здоровья
противников выше 0.
self.strike(enemy)
Персонажи атакуют
друг друга по
print(enemy.name, 'пал в этом нелегком бою!\n') очереди.
if enemy.health <= 0:
break
Если уровень
здоровья одного из
них стал меньше 0,
битва окончена.
sleep(5)
enemy.strike(self)
if self.health <= 0:
print(self.name, 'пал в этом нелегком бою!\n')
break
sleep(5)
Расставим паузы,
чтобы была интрига.

31.

class Hero(): #модуль Hero
def __init__(self, name, health, armor, power, weapon):
Тело метода
def print_info(self):
Тело метода
def strike(self, enemy):
Тело метода
def fight(self, enemy):
Тело метода
Запрограммируем в следующем
уровне битву Рыцаря и Разбойника.

32.

Основная часть программы:
from hero import Hero
knight = Hero('Ричард', 50, 25, 20, 'меч')
knight.print_info()
rascal = Hero('Питер', 20, 5, 5, 'нож')
rascal.print_info()
sleep(5)
knight.fight(rascal)

33.

Шаг 3 — улучшение удара и брони
Суть метода:
❖ если рыцарь выжил, то:
➢ здоровье восстанавливается до начального значения;
➢ класс брони увеличивается в два раза;
➢ сила удара увеличивается в два раза.
Как запрограммировать восстановление здоровья
и улучшение брони и удара?

34.

Дополним основную часть программы
if knight.health > 0:
knight.health = 50
knight.power *= 2
knight.armor *= 2
print(
'\n' + knight.name +
' восстановил силы и стал опытнее. Теперь сила его
удара: ' +
str(knight.power) + ', а класс брони:' +
str(knight.armor) + '\n')
Если рыцарь выжил.
Восстанавливаем
здоровье,
увеличиваем силу и
удваиваем броню.
Уведомляем
пользователя об
изменениях.

35.

Дополняем код схваткой с Драконом,
и оформляем повествование:

36.

Задачи:
➔ Вынесите класс Hero в отдельный модуль.
➔ Дополните модуль Hero методом fight().
➔ Запрограммируйте квест!

Запрограммируйте поединок Рыцаря и Разбойника.
Если победил Рыцарь, повысьте ему класс брони и силу.

Запрограммируйте поединок Рыцаря и Дракона.

37.

Для завершения работы
пройдите техническое интервью
1. Что такое класс, экземпляр класса, конструктор
класса?
1. Как связаны объекты и классы? Какой класс
стандартной библиотеки Python вы уже знаете?
2. Как создать свой класс? Где описываются
свойства (поля) класса?
English     Русский Правила