Краткое руководство с кофеином

Хорошо, вы, наверное, задаетесь вопросом - почему 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

Эти три объекта теперь можно редактировать независимо друг от друга. Все они имеют одинаковые методы и исходные атрибуты, поскольку были созданы с использованием одного и того же класса. Как всегда, я настоятельно рекомендую поэкспериментировать с идеями, обсуждаемыми в этой статье. Лучший способ изучить код: написать код. Так что приступайте, получайте удовольствие и не забудьте выпить себе кофе (неважно, откуда он)!