Краткое руководство с кофеином
Хорошо, вы, наверное, задаетесь вопросом - почему Starbucks заказывает? Почему бы не использовать обычные вещи для объяснения занятий? Будильники? Машины? Банковские счета? Буквально что-нибудь еще?
Ну, мол, пиши о том, что знаешь - а я миллениал с кофейной зависимостью. Итак, Starbucks, друзья.
В этой статье мы собираемся создавать объекты Python (* кхм * нелепые заказы Starbucks) с помощью классов. Мы рассмотрим классы в контексте объектно-ориентированного программирования, но сосредоточимся в основном на классах. (И кофе, конечно же.)
Давайте рассмотрим некоторые основы объектно-ориентированного программирования.
Хорошо, а что такое объектно-ориентированное программирование?
Если вы новый программист, скорее всего, вы уже работали в основном с процедурным программированием. Процедурное программирование работает как рецепт - с рядом задач, выполняемых последовательно с помощью функций.
Как следует из названия, объектно-ориентированное программирование (ООП) выполняет задачи с помощью объектов. Программный объект - это автономный тип данных, который имеет свои собственные характеристики и действия. ООП позволяет кодировщикам легко создавать и обновлять объекты данных.
Очевидно, что это слишком упрощенное введение в ООП. Чтобы получить более полное представление, посетите Real Python, сайт w3schools или это потрясающее введение в ООП от Tech With Tim на Youtube.
Прохладный. Так что же такое классы?
Классы - это чертежи объектов. Они описывают, какими характеристиками обладает объект (его «атрибуты») и что этот объект может сделать / сделать с ним (его «методы»). Классы позволяют пользователям создавать столько копий (или «экземпляров») этого объекта, сколько мы хотим. Они особенно полезны для создания нескольких объектов схожих типов - например, разных напитков Starbucks.
Потрясающие. Теперь давайте создадим класс, который мы будем использовать для создания наших объектов.
Давайте создадим класс "Напитки"
Поскольку я очень креативен, я собираюсь назвать этот урок «Напиток». Мы будем использовать следующий оператор для создания класса «Напиток»:
class Drink:
Затем мы создадим начальный метод («__init__»), который принимает три параметра: «self», «size», «name» и «type».
class Drink: def __init__(self, size, name, type):
Думайте о методе «__init__» как о функции «main». Подобно тому, как большинство программ включают «основную» функцию, почти каждый класс имеет метод «__init__». Создавая объект с использованием этого класса, мы автоматически «передаем» этот объект в качестве параметра нашему методу «__init__». Этот параметр «self» позволяет нам создавать (а позже настраивать) наши объекты.
Хорошо, но подожди - разве мы не варили напитки из Starbucks?
Да! Извините. А теперь перейдем к самому интересному.
У классов есть характеристики (или «атрибуты»). Каждый раз, когда объект создается с использованием определенного класса, он автоматически имеет атрибуты, определенные в этом классе.
Круто, так что - какие атрибуты есть у напитка Starbucks?
Строго для исследовательских целей, я заказал Starbucks и использовал их меню, чтобы увидеть различные варианты, из которых вы можете выбрать. Это сокращенный список атрибутов, которые я нашел из этих вариантов:
- Имя заказывающего
- Тип напитка
- Размер
- Ароматизаторы
- Начинки
- Эспрессо
- Подсластители
- Молочные продукты
Вот основной формат для создания атрибута в классе:
self.__[attribute] = value
Одно из преимуществ работы с ООП заключается в том, что оно позволяет нам скрывать атрибуты, то есть внешние программы не могут изменять значения атрибутов. Мы делаем это, добавляя два символа подчеркивания: «_ _» между self. и атрибут. Это эффективно «скрывает» атрибут и предотвращает его повреждение внешними программами.
Теперь давайте сделаем эти атрибуты частью нашего класса Drink. (Обратите внимание, что эти атрибуты могут иметь всевозможные значения - от параметров до целых чисел, строк, списков и т. Д.)
class Drink: def __init__(self, name, size, drinkType): self.__type = drinkType self.__size = size self.__name = name self.__flavors = [] self.__numFlavors = 0 self.__toppings = [] self.__numEspresso = 0 self.__typeSweetener = "None" self.__numSweetener = 0 self.__typeDairy = "None"
Превосходно. Теперь перейдем к нашим методам.
Методы - это, по сути, «глаголы» классов - они определяют, какие действия объект может выполнять / выполнять над ним.
Вот основной формат создания метода:
def methodName(self, parameter1, parameter2): statement statement etc.
В нашем случае мы хотим создать следующие методы:
- Добавить шот эспрессо → Один параметр: число. Если это число больше 0, добавьте его к значению атрибута self .__ numEspresso.
- Добавить подсластитель → Два параметра: число и предпочтение (строка). Если число больше 0, добавьте его к значению атрибута self .__ numSweetener. Значение атрибута self .__ typeSweetener теперь является предпочтительным.
- Добавить аромат → Два параметра: аромат и число. Добавляет аромат к атрибуту self .__ flavors (список). Добавляет число в атрибут self .__ numFlavors.
- Добавить посыпку → Один параметр: начинка. Добавляет верхнюю часть к атрибуту self .__ toppings (список).
- Добавить молочные продукты → Один параметр: предпочтения. Присваивает значение «предпочтения» атрибуту self .__ typeDairy.
#Define addEspresso method def addEspresso(self, num): if num > 0: self.__numEspresso += 1 #Define addSweetener method def addSweetener(self, num, preference): if num > 0: self.__typeSweetener = preference self.__numSweetener += num #Define addFlavor method def addFlavor(self, flavor, num): self.__flavors.append(flavor) self.__numFlavors += num #Define addTopping method def addTopping(self, topping): self.__toppings.append(topping) #Define addDairy method: def addDairy(self, preference): self.__typeDairy = preference
Последний шаг: добавьте метод «__str__»
Этот метод всегда возвращает строку. Мы вызываем этот метод, передавая объект в качестве аргумента инструкции печати. В нашем случае мы будем использовать этот метод для проверки наших заказов, прежде чем мы их «разместим». Вот что выдаст наш код:
[Name] ordered a [size] [drink type] with the following additions:[number espresso shots] Espresso shots [number flavor shots] [flavors] Flavor shots [dairy type]
Вот наш метод __str__:
def __str__(self): return (f"{self.__name} ordered a {self.__size {self.__drinkType} with the following additions: \n" f"{self.__numEspresso} Espresso shots \n" f"{self.__numFlavors} {self.__flavors} flavor shots \n" f"{self.__typeDairy}").
А теперь приготовим напитки.
Напиток 1. Ванесса хочет двойной ванильный эспрессо-латте Venti с овсяным молоком и три дополнительных стопки фундука без сахара.
(Три для тебя, Ванесса. Иди, Ванесса.)
Наши первые шаги: 1) импортировать наш класс и 2) создать наш объект (напиток Ванессы).
import drink drink1 = drink.Drink("Vanessa", "Venti", "Latte")
Наше первое утверждение импортирует класс «Напиток».
Наш второй оператор передает четыре аргумента методу __init__: имя (Vanessa), размер (Venti), тип напитка (Latte) и сам объект (drink1).
Теперь drink1 официально является объектом - его можно изменить с помощью любого из методов, встроенных в класс Drink.
Ванесса хотела две порции эспрессо. Давайте воспользуемся методом addEspresso, чтобы добавить их в drink1.
drink1.addEspresso(2)
Мы вызовем метод addFlavor, чтобы добавить три порции аромата фундука без сахара:
drink1.addFlavor(“sugar-free hazelnut”, 3)
Давайте добавим овсяное молоко, вызвав метод addDairy:
drink1.addDairy("oatmilk")
Наконец, давайте рассмотрим наш заказ, вызвав метод печати:
print(drink1) Output: Vanessa ordered a Venti Latte with the following additions: 2 Espresso shots 3 ['hazelnut'] flavor shots oatmilk
Выпить 2. Иветт хочет холодный отвар Trenta с медом и миндальным молоком с тройной порцией эспрессо (- Иветт, милая, ты в порядке? -), четырьмя порциями ванильного вкуса и дополнительной пеной.
Вот как мы это сделаем:
#1) Create our drink object drink2 = drink.Drink("Yvette", "Trenta", "Honey Almond Milk Cold Brew") #2) Add 3 espresso shots drink2.addEspresso(3) #3) Add 4 vanilla flavor shots drink2.addFlavor(“vanilla”, 4) #4) Add extra foam using the "addDairy" method drink2.addDairy("extra foam") #5) Review the order print(drink2) Output: Yvette ordered a Trenta Honey Almond Milk Cold Brew with the following additions: 3 Espresso shots 4 ['vanilla'] flavor shots extra foam
Напиток 3. Маттео хочет высокий латте со льдом Starbucks Blonde Vanilla Latte с дополнительными сливками, дополнительной пеной, тремя дозаторами сиропа с ананасовым имбирем и дополнительной порцией эспрессо.
#1) Create our drink object drink3 = drink.Drink("Matteo", "Tall", "Iced Starbucks Blonde Vanilla Latte") #2) Add 3 espresso shots drink3.addEspresso(1) #3) Add 4 vanilla flavor shots drink3.addFlavor(“Pineapple Ginger”, 3) #4) Add extra foam using the "addDairy" method drink3.addDairy("extra foam, extra cream") #5) Review the order print(drink3) Output: Matteo ordered a Tall Iced Starbucks Blonde Vanilla Latte with the following additions: 1 Espresso shots 3 ['Pineapple Ginger'] flavor shots extra foam, extra cream
Эти три объекта теперь можно редактировать независимо друг от друга. Все они имеют одинаковые методы и исходные атрибуты, поскольку были созданы с использованием одного и того же класса. Как всегда, я настоятельно рекомендую поэкспериментировать с идеями, обсуждаемыми в этой статье. Лучший способ изучить код: написать код. Так что приступайте, получайте удовольствие и не забудьте выпить себе кофе (неважно, откуда он)!