- Главная
- Информатика
- Основы языка программирования. Объекты, классы, методы. Лекция 5.1
Содержание
- 2. Напоминание: 29/10/2022 (следующее занятие) Перед лекцией будет тест по 3 и 4 модулю (3, 4.1 и
- 3. все в Python, от чисел до модулей, является объектами. Однако Python скрывает большую часть принципов функционирования
- 4. Класс сообщает Python, как создать объект, представляющий собаку. После того как класс будет написан, мы используем
- 5. Функция, являющаяся частью класса, называется методом. Все, что вы узнали ранее о функциях, также относится и
- 6. Метод __init__() определяется с тремя параметрами: self, name и age. Параметр self обязателен в определении метода;
- 7. Любая переменная с префиксом self доступна для каждого метода в классе, и вы также сможете обращаться
- 8. В классе Dog также определяются два метода: sit() и roll_over(). Так как этим методам не нужна
- 9. Мы приказываем Python создать экземпляр собаки с кличкой 'willie' и возрастом 6. В процессе обработки этой
- 10. Для обращения к атрибутам экземпляра используется «точечная» запись. В строке из примера мы обращаемся к значению
- 11. После создания экземпляра на основе класса Dog можно применять точечную запись для вызова любых методов, определенных
- 12. На основе класса можно создать столько экземпляров, сколько вам потребуется. Создадим второй экземпляр Dog с именем
- 13. CLASSES car.py class Car(): """Простая модель автомобиля.""" (1) def __init__(self, make, model, year): """Инициализирует атрибуты описания
- 14. Каждый атрибут класса должен иметь исходное значение, даже если оно равно 0 или пустой строке. В
- 15. Значение атрибута можно изменить одним из трех способов: изменить его прямо в экземпляре, задать значение при
- 16. Чтобы изменить значение атрибута, проще всего обратиться к нему прямо через экземпляр. В следующем примере на
- 17. В класс можно включить методы, которые изменяют некоторые атрибуты за вас. Вместо того чтобы изменять атрибут
- 18. Метод update_odometer() можно расширить так, чтобы при каждом изменении показаний одометра выполнялась некоторая дополнительная работа. Добавим
- 19. Иногда значение атрибута требуется изменить с заданным приращением (вместо того чтобы присваивать атрибуту произвольное новое значение).
- 20. Работа над новым классом не обязана начинаться с нуля. Если класс, который вы пишете, представляет собой
- 21. Первое, что делает Python при создании экземпляра класса-потомка, — присваивает значения всем атрибутам класса-родителя. Для этого
- 22. После создания класса-потомка, наследующего от класса-родителя, можно переходить к добавлению новых атрибутов и методов, необходимых для
- 23. Любой метод родительского класса, который в моделируемой ситуации делает не то, что нужно, можно переопределить. Для
- 24. Списки атрибутов и методов растут, и через какое-то время файлы становятся длинными и громоздкими. В такой
- 25. Начнем с создания модуля, содержащего только класс Car В точке 1 включается строка документации уровня модуля
- 26. В одном модуле можно хранить сколько угодно классов, хотя все эти классы должны быть каким-то образом
- 27. В файл программы можно импортировать столько классов, сколько потребуется. Если вы захотите создать обычный автомобиль и
- 28. Также возможно импортировать весь модуль, а потом обращаться к нужным классам с использованием точечной записи. Этот
- 29. Для импортирования всех классов из модуля используется следующий синтаксис: from имя_модуля import * Но делать это
- 30. Ресторан: создайте класс с именем Restaurant. Метод __init__() класса Restaurant должен содержать два атрибута: restaurant_name и
- 31. 4. Посетители: начните с программы из упражнения 1. Добавьте атрибут number_served со значением по умолчанию 0;
- 32. 1.Попытки входа: добавьте атрибут login_attempts в класс User из упражнения 3 раздела Tasks. Напишите метод increment_login_attempts(),
- 34. Скачать презентацию
Слайд 2Напоминание:
29/10/2022 (следующее занятие)
Перед лекцией будет тест по 3 и 4 модулю
Напоминание:
29/10/2022 (следующее занятие)
Перед лекцией будет тест по 3 и 4 модулю
Те, кто по уважительным причинам не сможет присутствовать очно, могут пройти тест онлайн на портале Moodle с 13.30 до 23.00
Максимальная оценка 100 баллов по каждому модулю
Проходная оценка 60 баллов по каждому модулю
Для зачета будет достаточно набрать проходной балл
Напоминаю, что за текущим прогрессом можно следить в таблице:
https://docs.google.com/spreadsheets/d/1nHotD8t1h11jzW3kYlMOSpDbrluepxVQeH6B_MJgMcE/edit#gid=0
REMINDER
Слайд 3все в Python, от чисел до модулей, является объектами. Однако Python скрывает большую
все в Python, от чисел до модулей, является объектами. Однако Python скрывает большую
Объект содержит как данные (переменные, которые называются атрибутами), так и код (функции, которые называются методами). Он представляет собой уникальный экземпляр какого-то конкретного предмета.
Объекты можно считать существительными, а их методы — глаголами. Объект представляет отдельную вещь, а его методы определяют, как она взаимодействует с другими вещами.
В отличие от модулей, вы можете иметь одновременно несколько объектов, каждый из которых имеет разные значения атрибутов. Они являются суперструктурами данных, в которые был добавлен код
OBJECTS
Слайд 4 Класс сообщает Python, как создать объект, представляющий собаку. После того как класс
Класс сообщает Python, как создать объект, представляющий собаку. После того как класс
В каждом экземпляре, созданном на основе класса Dog, будет храниться кличка и возраст; кроме того, в нем будут присутствовать методы sit() и roll_over()
Сначала определяется класс с именем Dog. По общепринятым соглашениям имена, начинающиеся с символа верхнего регистра, в Python обозначают классы. Круглые скобки в определении класса пусты, потому что класс создается с нуля.
CLASS
dog.py
class Dog():
"""Простая модель собаки."""
def __init__(self, name, age):
"""Инициализирует атрибуты name и age."""
self.name = name
self.age = age
def sit(self):
"""Собака садится по команде."""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""Собака перекатывается по команде."""
print(self.name.title() + " rolled over!")
Слайд 5 Функция, являющаяся частью класса, называется методом. Все, что вы узнали ранее о
Функция, являющаяся частью класса, называется методом. Все, что вы узнали ранее о
__init__()
dog.py
class Dog():
"""Простая модель собаки."""
def __init__(self, name, age):
"""Инициализирует атрибуты name и age."""
self.name = name
self.age = age
def sit(self):
"""Собака садится по команде."""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""Собака перекатывается по команде."""
print(self.name.title() + " rolled over!")
Слайд 6 Метод __init__() определяется с тремя параметрами: self, name и age. Параметр self
Метод __init__() определяется с тремя параметрами: self, name и age. Параметр self
__init__()
dog.py
class Dog():
"""Простая модель собаки."""
def __init__(self, name, age):
"""Инициализирует атрибуты name и age."""
self.name = name
self.age = age
def sit(self):
"""Собака садится по команде."""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""Собака перекатывается по команде."""
print(self.name.title() + " rolled over!")
Слайд 7 Любая переменная с префиксом self доступна для каждого метода в классе, и
Любая переменная с префиксом self доступна для каждого метода в классе, и
__init__()
dog.py
class Dog():
"""Простая модель собаки."""
def __init__(self, name, age):
"""Инициализирует атрибуты name и age."""
self.name = name
self.age = age
def sit(self):
"""Собака садится по команде."""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""Собака перекатывается по команде."""
print(self.name.title() + " rolled over!")
Слайд 8 В классе Dog также определяются два метода: sit() и roll_over(). Так как
В классе Dog также определяются два метода: sit() и roll_over(). Так как
Экземпляры, которые будут созданы позднее, смогут вызывать эти методы. Пока методы sit() и roll_over() ограничиваются простым выводом сообщения о том, что собака садится или перекатывается.
__init__()
dog.py
class Dog():
"""Простая модель собаки."""
def __init__(self, name, age):
"""Инициализирует атрибуты name и age."""
self.name = name
self.age = age
def sit(self):
"""Собака садится по команде."""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""Собака перекатывается по команде."""
print(self.name.title() + " rolled over!")
Слайд 9Мы приказываем Python создать экземпляр собаки с кличкой 'willie' и возрастом 6.
В
Мы приказываем Python создать экземпляр собаки с кличкой 'willie' и возрастом 6.
В
Метод __init__() не содержит явной команды return, но Python автоматически возвращает экземпляр, представляющий собаку. Этот экземпляр сохраняется в переменной my_dog.
Создание экземпляра
class Dog():
...
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
Слайд 10Для обращения к атрибутам экземпляра используется «точечная» запись. В строке из примера мы
Для обращения к атрибутам экземпляра используется «точечная» запись. В строке из примера мы
my_dog.name
Python обращается к экземпляру my_dog и ищет атрибут name, связанный с экземпляром my_dog.
Это тот же атрибут, который обозначался self.name в классе Dog. Тот же прием используется для работы с атрибутом age. В первой команде print вызов my_dog.name.title() записывает 'willie' (значение атрибута name экземпляра my_dog) с символа верхнего регистра. Во второй команде print вызов str(my_dog.age) преобразует 6, значение атрибута age экземпляра my_dog, в строку.
Пример выводит сводку известных фактов о my_dog:
My dog's name is Willie.
My dog is 6 years old.
Создание экземпляра
class Dog():
...
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
Слайд 11После создания экземпляра на основе класса Dog можно
применять точечную запись для вызова
После создания экземпляра на основе класса Dog можно
применять точечную запись для вызова
определенных в Dog
Чтобы вызвать метод, укажите экземпляр (в данном
случае my_dog) и вызываемый метод, разделив их точкой.
В ходе обработки my_dog.sit() Python ищет метод sit()в
классе Dog и выполняет его код. Строка my_dog.roll_over()
интерпретируется аналогичным образом.
Теперь экземпляр послушно выполняет полученные команды:
Willie is now sitting.
Willie rolled over!
Это очень полезный синтаксис. Если атрибутам и методам были присвоены содержательные имена (например, name, age, sit() и roll_over()), разработчик сможет легко понять, что делает блок кода, — даже если он видит этот блок впервые.
Вызов методов
class Dog():
...
my_dog = Dog('willie', 6)
my_dog.sit()
my_dog.roll_over()
Слайд 12На основе класса можно создать столько экземпляров, сколько вам потребуется. Создадим второй экземпляр
На основе класса можно создать столько экземпляров, сколько вам потребуется. Создадим второй экземпляр
В этом примере создаются два экземпляра с именами Willie и Lucy. Каждый экземпляр обладает своим набором атрибутов и способен выполнять действия из общего набора:
Даже если второй собаке будут назначены те же имя и возраст, Python все равно создаст отдельный экземпляр класса Dog. Вы можете создать сколько угодно экземпляров одного класса при условии, что эти экземпляры хранятся в переменных с разными именами или занимают разные позиции в списке или словаре
Создание нескольких экземпляров
class Dog():
...
my_dog = Dog('willie', 6)
your_dog = Dog('lucy', 3)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
my_dog.sit()
print("\nYour dog's name is " + your_dog.name.title() + ".")
print("Your dog is " + str(your_dog.age) + " years old.")
your_dog.sit()
_______________________
My dog's name is Willie.
My dog is 6 years old.
Willie is now sitting.
Your dog's name is Lucy.
Your dog is 3 years old.
Lucy is now sitting.
Слайд 13CLASSES
car.py
class Car():
"""Простая модель автомобиля."""
(1) def __init__(self, make, model, year):
"""Инициализирует атрибуты описания автомобиля."""
CLASSES
car.py
class Car():
"""Простая модель автомобиля."""
(1) def __init__(self, make, model, year):
"""Инициализирует атрибуты описания автомобиля."""
self.model = model
self.year = year
(2)def get_descriptive_name(self):
"""Возвращает аккуратно отформатированное описание."""
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
(3) my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
Слайд 14Каждый атрибут класса должен иметь исходное значение, даже если оно равно 0 или
Каждый атрибут класса должен иметь исходное значение, даже если оно равно 0 или
Добавим атрибут с именем odometer_reading, исходное значение которого всегда равно 0. Также в класс будет включен метод read_odometer() для чтения текущих показаний одометра:
ATRIBUTES
class Car():
def __init__(self, make, model, year):
"""Инициализирует атрибуты описания автомобиля."""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
...
def read_odometer(self):
"""Выводит пробег машины в милях."""
print("This car has " + str(self.odometer_reading) + " miles on it.")
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
_________________________
2016 Audi A4
This car has 0 miles on it.
Слайд 15Значение атрибута можно изменить одним из трех способов: изменить его прямо в экземпляре,
Значение атрибута можно изменить одним из трех способов: изменить его прямо в экземпляре,
ATRIBUTES
Слайд 16Чтобы изменить значение атрибута, проще всего обратиться к нему прямо через экземпляр. В
Чтобы изменить значение атрибута, проще всего обратиться к нему прямо через экземпляр. В
Точечная запись используется для обращения к атрибуту odometer_reading экземпляра и прямого присваивания его значения. Эта строка приказывает Python взять экземпляр my_new_car, найти связанный с ним атрибут odometer_reading и задать значение атрибута равным 23
Иногда подобные прямые обращения к атрибутам допустимы, но чаще разработчик пишет вспомогательный метод, который изменяет значение за него.
Прямое изменение значения атрибута
class Car():
...
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
_________________________
2016 Audi A4
This car has 23 miles on it.
Слайд 17В класс можно включить методы, которые изменяют некоторые атрибуты за вас. Вместо того
В класс можно включить методы, которые изменяют некоторые атрибуты за вас. Вместо того
В следующем примере в класс включается метод update_odometer() для изменения показаний одометра:
Изменение значения атрибута с использованием метода
class Car():
def update_odometer(self, mileage):
"""Устанавливает заданное значение на одометре."""
self.odometer_reading = mileage
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23)
my_new_car.read_odometer()
_________________________
2016 Audi A4
This car has 23 miles on it.
Слайд 18Метод update_odometer() можно расширить так, чтобы при каждом изменении показаний одометра выполнялась некоторая
Метод update_odometer() можно расширить так, чтобы при каждом изменении показаний одометра выполнялась некоторая
Теперь update_odometer() проверяет новое значение перед изменением атрибута. Если новое значение mileage больше или равно текущего, self.odometer_reading, показания одометра можно обновить новым значением. Если же новое значение меньше текущего, вы получите предупреждение о недопустимости обратной подкрутки.
Изменение значения атрибута с использованием метода
class Car():
def update_odometer(self, mileage):
""“
Устанавливает на одометре заданное значение.
При попытке обратной подкрутки изменение
отклоняется.
"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer!")
_________________________
Слайд 19Иногда значение атрибута требуется изменить с заданным приращением (вместо того чтобы присваивать атрибуту
Иногда значение атрибута требуется изменить с заданным приращением (вместо того чтобы присваивать атрибуту
Новый метод increment_odometer()получает расстояние в милях и прибавляет его к self.odometer_reading. Далее создается экземпляр my_used_car. Мы инициализируем показания его одометра значением 23 500; для этого вызывается метод update_odometer(), которому передается значение 23500. Затем вызывается метод increment_odometer(), которому передается значение 100, чтобы увеличить показания одометра на 100 миль, пройденные с момента покупки:
Изменение значения атрибута с приращением
class Car():
...
def update_odometer(self, mileage):
--snip--
def increment_odometer(self, miles):
"""Увеличивает показания одометра с заданным
приращением."""
self.odometer_reading += miles
my_used_car = Car('subaru', 'outback', 2013)
print(my_used_car.get_descriptive_name())
my_used_car.update_odometer(23500)
my_used_car.read_odometer()
my_used_car.increment_odometer(100)
my_used_car.read_odometer()
_________________________
2013 Subaru Outback
This car has 23500 miles on it.
This car has 23600 miles on it.
Слайд 20Работа над новым классом не обязана начинаться с нуля. Если класс, который вы
Работа над новым классом не обязана начинаться с нуля. Если класс, который вы
Наследование
class BaseClass:
Тело родительского класса
class DerivedClass(BaseClass):
Телодочернегокласса
Слайд 21Первое, что делает Python при создании экземпляра класса-потомка, — присваивает значения всем атрибутам
Первое, что делает Python при создании экземпляра класса-потомка, — присваивает значения всем атрибутам
В точке 1 строится экземпляр Car. В точке 2 определяется класс-потомок ElectricCar. Метод __init__() в точке 3 получает информацию, необходимую для создания экземпляра Car. Функция super() в строке 4 — специальная функция, которая помогает Python связать потомка с родителем.
Наследование
electric_car.py
1classCar():
"""Простая модель автомобиля."""
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odometer(self):
print("This car has " + str(self.odometer_reading) + " miles on it.")
def update_odometer(self, mileage):
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer!")
def increment_odometer(self, miles):
self.odometer_reading += miles
2 class ElectricCar(Car):
"""Представляет аспекты машины, специфические для электромобилей."""
3 def __init__(self, make, model, year):
"""Инициализирует атрибуты класса-родителя."""
4 super().__init__(make, model, year)
5 my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
Слайд 22После создания класса-потомка, наследующего от класса-родителя, можно переходить к добавлению новых атрибутов и
После создания класса-потомка, наследующего от класса-родителя, можно переходить к добавлению новых атрибутов и
Добавим атрибут, специфический для электромобилей (например, мощность аккумулятора), и метод для вывода информации об этом атрибуте
Определение атрибутов и методов класса-потомка
class Car():
...
class ElectricCar(Car):
"""Представляет аспекты машины, специфические для электромобилей."""
def __init__(self, make, model, year):
"""Инициализирует атрибуты класса-родителя.
Затем инициализирует атрибуты, специфические для электромобиля.
"""
super().__init__(make, model, year)
1 self.battery_size = 70
2 def describe_battery(self):
"""Выводит информацию о мощности аккумулятора."""
print("This car has a " + str(self.battery_size) + "-kWh battery.")
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
Слайд 23Любой метод родительского класса, который в моделируемой ситуации делает не то, что нужно,
Любой метод родительского класса, который в моделируемой ситуации делает не то, что нужно,
Допустим, в классе Car имеется метод fill_gas_tank(). Для электромобилей заправка бензином бессмысленна, поэтому этот метод логично переопределить.
Переопределение методов класса-родителя
def ElectricCar(Car):
...
def fill_gas_tank():
"""Уэлектромобилейнетбензобака."""
print("This car doesn't need a gas tank!")
Слайд 24Списки атрибутов и методов растут, и через какое-то время файлы становятся длинными и
Списки атрибутов и методов растут, и через какое-то время файлы становятся длинными и
Например, при дальнейшей доработке класса ElectricCar может оказаться, что в нем появилось слишком много атрибутов и методов, относящихся к аккумулятору. В таком случае можно остановиться и переместить все эти атрибуты и методы в отдельный класс с именем Battery. Затем экземпляр Battery становится атрибутом класса ElectricCar:
Экземпляры как атрибуты
class Car():
...
1 class Battery():
"""Простая модель аккумулятора электромобиля."""
2 def __init__(self, battery_size=70):
"""Инициализируетатрибутыаккумулятора."""
self.battery_size = battery_size
3 def describe_battery(self):
"""Выводит информацию о мощности аккумулятора."""
print("This car has a " + str(self.battery_size) + "-kWh battery.")
class ElectricCar(Car):
"""Представляет аспекты машины, специфические для электромобилей."""
def __init__(self, make, model, year):
"""
Инициализирует атрибуты класса-родителя.
Затем инициализирует атрибуты, специфические для электромобиля.
"""
super().__init__(make, model, year)
4 self.battery = Battery()
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
5 my_tesla.battery.describe_battery()
Слайд 25Начнем с создания модуля, содержащего только класс Car
В точке 1 включается строка документации
Начнем с создания модуля, содержащего только класс Car
В точке 1 включается строка документации
Теперь мы создадим отдельный файл с именем my_car.py. Этот файл импортирует класс Car и создает экземпляр этого класса
Импортирование одного класса
car.py
1 """Класс для представления автомобиля."""
class Car():
"""Простая модель автомобиля."""
def __init__(self, make, model, year):
"""Инициализирует атрибуты описания автомобиля."""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
"""Возвращаетаккуратноотформатированноеописание."""
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odometer(self):
"""Выводит пробег машины в милях."""
print("This car has " + str(self.odometer_reading) + " miles on it.")
def update_odometer(self, mileage):
"""
Устанавливает на одометре заданное значение.
При попытке обратной подкрутки изменение отклоняется.
"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer!")
def increment_odometer(self, miles):
"""Увеличивает показания одометра с заданным приращением."""
self.odometer_reading += miles
my_car.py
1 from car import Car
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
Слайд 26В одном модуле можно хранить сколько угодно классов, хотя все эти классы должны
В одном модуле можно хранить сколько угодно классов, хотя все эти классы должны
Теперь вы можете создать новый файл с именем my_electric_car.py, импортировать класс ElectricCar и создать новый экземпляр электромобиля:
Хранение нескольких классов в модуле
car.py
"""Классы для представления машин с бензиновым и электродвигателем."""
class Car():
...
class Battery():
"""Простая модель аккумулятора электромобиля."""
def __init__(self, battery_size=60):
"""Инициализация атрибутов аккумулятора."""
self.battery_size = battery_size
def describe_battery(self):
"""Выводит информацию о мощности аккумулятора."""
print("This car has a " + str(self.battery_size) + "-kWh battery.")
def get_range(self):
"""Выводит приблизительный запас хода для аккумулятора."""
if self.battery_size == 70:
range = 240
elif self.battery_size == 85:
range = 270
message = "This car can go approximately " + str(range)
message += " miles on a full charge."
print(message)
class ElectricCar(Car):
"""Представляет аспекты машины, специфические для электромобилей."""
def __init__(self, make, model, year):
"""
Инициализирует атрибуты класса-родителя.
Затем инициализирует атрибуты, специфические для электромобиля.
"""
super().__init__(make, model, year)
self.battery = Battery()
my_electric_car.py
from car import ElectricCar
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
Слайд 27В файл программы можно импортировать столько классов, сколько потребуется. Если вы захотите создать
В файл программы можно импортировать столько классов, сколько потребуется. Если вы захотите создать
Чтобы импортировать несколько классов из модуля, разделите их имена запятыми 1. После того как необходимые классы будут импортированы, вы можете создать столько экземпляров каждого класса, сколько потребуется.
Импортирование нескольких классов из модуля
my_cars.py
1 from car import Car, ElectricCar
2 my_beetle = Car('volkswagen', 'beetle', 2016)
print(my_beetle.get_descriptive_name())
3 my_tesla = ElectricCar('tesla', 'roadster', 2016)
print(my_tesla.get_descriptive_name())
Слайд 28Также возможно импортировать весь модуль, а потом обращаться к нужным классам с использованием
Также возможно импортировать весь модуль, а потом обращаться к нужным классам с использованием
Импортирование всего модуля
my_cars.py
1 import car
2 my_beetle = car.Car('volkswagen', 'beetle', 2016)
print(my_beetle.get_descriptive_name())
3 my_tesla = car.ElectricCar('tesla', 'roadster', 2016)
print(my_tesla.get_descriptive_name())
Слайд 29Для импортирования всех классов из модуля используется следующий синтаксис:
from имя_модуля import *
Но делать
Для импортирования всех классов из модуля используется следующий синтаксис:
from имя_модуля import *
Но делать
Импортирование всех классов из модуля
Слайд 30Ресторан: создайте класс с именем Restaurant. Метод __init__() класса Restaurant должен содержать два
Ресторан: создайте класс с именем Restaurant. Метод __init__() класса Restaurant должен содержать два
Три ресторана: начните с класса из упражнения 1. Создайте три разных экземпляра, вызовите для каждого экземпляра метод describe_restaurant().
Пользователи: создайте класс с именем User. Создайте два атрибута first_name и last_name, а затем еще несколько атрибутов, которые обычно хранятся в профиле пользователя. Напишите метод describe_user(), который выводит сводку с информацией о пользователе. Создайте еще один метод greet_user() для вывода персонального приветствия для пользователя. Создайте несколько экземпляров, представляющих разных пользователей. Вызовите оба метода для каждого пользователя.
TASKS
Слайд 314. Посетители: начните с программы из упражнения 1. Добавьте атрибут number_served со значением
4. Посетители: начните с программы из упражнения 1. Добавьте атрибут number_served со значением
Добавьте метод с именем set_number_served(), позволяющий задать количество обслуженных посетителей. Вызовите метод с новым числом, снова выведите значение.
Добавьте метод с именем increment_number_served(), который увеличивает количество обслуженных посетителей на заданную величину. Вызовите этот метод с любым числом, которое могло бы представлять количество обслуженных клиентов — скажем, за один день.
5. Администратор: администратор — особая разновидность пользователя. Напишите класс с именем Admin, наследующий от класса User из упражнения 3. Добавьте атрибут privileges для хранения списка строк вида «разрешено добавлять сообщения», «разрешено удалять пользователей», «разрешено банить пользователей» и т. д. Напишите метод show_privileges() для вывода набора привилегий администратора. Создайте экземпляр Admin и вызовите свой метод.
TASKS
Слайд 321.Попытки входа: добавьте атрибут login_attempts в класс User из упражнения 3 раздела Tasks.
1.Попытки входа: добавьте атрибут login_attempts в класс User из упражнения 3 раздела Tasks.
Создайте экземпляр класса User и вызовите increment_login_attempts() несколько раз. Выведите значение login_attempts, чтобы убедиться в том, что значение было изменено правильно, а затем вызовите reset_login_attempts(). Снова выведите login_attempts и убедитесь в том, что значение обнулилось.
2.Киоск с мороженым: киоск с мороженым — особая разновидность ресторана. Напишите класс IceCreamStand, наследующий от класса Restaurant из упражнения 1 раздела Tasks или упражнения 4 раздела Tasks. Подойдет любая версия класса; просто выберите ту, которая вам больше нравится. Добавьте атрибут с именем flavors для хранения списка сортов мороженого. Напишите метод, который выводит этот список. Создайте экземпляр IceCreamStand и вызовите этот метод.
PRACTICAL TASK 5