Объектно-ориентированное программирование на Python
- Вступление
- Плюсы и минусы ООП
- Класс
- Объекты
- Атрибуты
- Методы
- Конструкторы
- Локальные и Глобальные переменные
- Модификаторы доступа
- Наследование
- Полиморфизм
- Инкапсуляция
- Вывод
Вступление
Объектно-ориентированное программирование (ООП)-это парадигма программирования, в которой различные компоненты компьютерной программы моделируются по образцу реальных объектов. Объект-это все, что имеет некоторые характеристики и может выполнять определенную функцию.
Рассмотрим сценарий, в котором вы должны разработать автомобильную гоночную игру Формулы-1 с использованием объектно-ориентированного подхода программирования. Первое, что вам нужно сделать,-это идентифицировать реальные объекты в реальной гонке Формулы-1. Каковы сущности в гонке Формулы-1, которые обладают некоторыми характеристиками и могут выполнять любую функцию? Один из очевидных ответов на этот вопрос-автомобиль. Автомобиль может иметь такие характеристики, как мощность двигателя, марка, модель, производитель и т. Д. Точно так же автомобиль может быть запущен, остановлен, ускорен и так далее. Гонщик может быть еще одним объектом в гонке Формулы-1. Водитель имеет национальность, возраст, пол и т. Д., И он может выполнять такие функции, как управление автомобилем, перемещение рулевого управления или изменение коробки передач.
Как и в этом примере, в объектно-ориентированном программировании мы будем создавать объекты для соответствующей сущности реального мира.
Здесь важно отметить, что объектно-ориентированное программирование не является концепцией, зависящей от языка. Это общая концепция программирования, и большинство современных языков, таких как Java, C#, C++ и Python, поддерживают объектно-ориентированное программирование. В этой статье мы увидим подробное введение в объектно-ориентированное программирование на Python, но перед этим мы увидим некоторые преимущества и недостатки объектно-ориентированного программирования.
Плюсы и минусы ООП
Ниже приведены некоторые преимущества объектно-ориентированного программирования:
- Объектно-ориентированное программирование способствует повторному использованию. Компьютерная программа написана в виде объектов и классов, которые могут быть повторно использованы и в других проектах.
- Модульный подход, используемый в объектно-ориентированном программировании, приводит к высокому уровню обслуживания кода.
- В объектно-ориентированном программировании каждый класс имеет определенную задачу. Если ошибка возникает в одной части кода, вы можете исправить ее локально, не затрагивая другие части кода.
- Инкапсуляция данных (которую мы рассмотрим далее в статье) добавляет дополнительный уровень безопасности программе, разработанной с использованием объектно-ориентированного подхода.
Хотя объектно-ориентированное программирование имеет ряд преимуществ, как обсуждалось, у него есть и некоторые недостатки, некоторые из которых были перечислены ниже:
- Детальное знание предметной области разрабатываемого программного обеспечения необходимо для создания объектов. Не каждая сущность в программном обеспечении является кандидатом на реализацию в качестве объекта. Новичкам бывает трудно определить эту тонкую грань.
- По мере того как вы добавляете все больше и больше классов в код, размер и сложность программы растут экспоненциально.
В следующем разделе мы рассмотрим некоторые из наиболее важных концепций объектно-ориентированного программирования.
Как следует из названия, объектно-ориентированное программирование-это все об объектах. Однако, прежде чем объект может быть создан, мы должны определить класс для объекта.
Класс
Класс в объектно-ориентированном программировании служит чертежом объекта. Класс можно рассматривать как карту для дома. Вы можете получить представление о том, как выглядит дом, просто взглянув на карту. Однако сам по себе класс-ничто. Например, карта-это не дом, она только объясняет, как будет выглядеть настоящий дом.
Отношения между классом и объектом можно понять, взглянув на отношения между автомобилем и Audi. “Ауди” – это на самом деле автомобиль. Однако не существует такой вещи, как только автомобиль. Автомобиль-это абстрактное понятие, на самом деле оно реализовано в виде Toyota, Ferrari, Honda и т. д.
Ключевое слово class используется для создания класса в Python. Имя класса следует за ключевым словом class , за которым следует символ двоеточия. Тело класса начинается с новой строки с отступом на одну вкладку слева.
Давайте посмотрим, как мы можем создать очень простой класс в Python. Взгляните на следующий код:
# Creates class Car
class Car:
# create class attributes
name = "c200"
make = "mercedez"
model = 2008
# create class methods
def start(self):
print ("Engine started")
def stop(self):
print ("Engine switched off")
В приведенном выше примере мы создаем класс с именем Car с тремя атрибутами: name , make и model . Класс car также содержит два метода: start() и stop() .
Объекты
Ранее мы говорили, что класс предоставляет чертеж. Однако, чтобы действительно использовать объекты и методы класса, вам нужно создать объект из этого класса. Существует несколько методов и атрибутов класса, которые можно использовать без объекта, что мы увидим в следующем разделе. А пока просто имейте в виду, что по умолчанию нам нужно создать объект класса, прежде чем мы сможем использовать его методы и атрибуты.
Объект также называется экземпляром; поэтому процесс создания объекта класса называется instantiation . В Python для создания объекта класса нам просто нужно написать имя класса, за которым следуют открывающие и закрывающие скобки.
Давайте создадим объект класса Car , который мы создали в предыдущем разделе.
# Creates car_a object of Car class car_a = Car() # Creates car_b object of car class car_b = Car()
В приведенном выше скрипте мы создали два объекта класса car: car_a и car_b . Чтобы проверить тип созданных нами объектов, мы можем использовать метод type и передать ему имя нашего объекта. Выполните следующий сценарий:
print(type(car_b))
В выводе вы увидите:
Который говорит, что тип объекта car_b является классом Car .
На этом этапе мы создали наш класс и соответствующие объекты. Теперь пришло время получить доступ к атрибутам класса и вызвать метод класса с помощью объекта класса. Для этого вам просто нужно написать имя объекта, за которым следует оператор точки и имя атрибута или метода, к которому вы хотите получить доступ или вызвать, соответственно. Взгляните на следующий пример:
car_b.start()
В приведенном выше скрипте мы вызываем метод start() через объект car_b . Результат будет следующим:
Engine started
Аналогично, вы можете получить доступ к атрибуту, используя следующий синтаксис:
print(car_b.model)
В выходных данных вы увидите значение атрибута model , как показано ниже:
2008
Атрибуты
В предыдущем разделе мы видели, как мы можем создавать объекты класса и использовать эти объекты для доступа к атрибутам класса.
В Python каждый объект имеет некоторые атрибуты и методы по умолчанию в дополнение к пользовательским атрибутам. Для просмотра всех атрибутов и методов объекта можно использовать встроенную функцию dir () . Давайте попробуем увидеть все атрибуты объекта car_b , который мы создали в предыдущем разделе. Выполните следующий сценарий:
dir(car_b)
В выходных данных вы увидите следующие атрибуты:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'make', 'model', 'name', 'start', 'stop']
Эта встроенная функция полезна для проверки всех атрибутов и функций объекта, особенно при использовании через REPL Python.
Атрибуты класса и экземпляра
Атрибуты можно разделить на два типа: атрибуты класса и атрибуты экземпляра. Атрибуты класса являются общими для всех объектов класса, в то время как атрибуты экземпляра являются исключительным свойством экземпляра.
Помните, что экземпляр-это просто другое имя для объекта. Атрибуты экземпляра объявляются внутри любого метода, в то время как атрибуты класса объявляются вне любого метода. Следующий пример проясняет разницу:
class Car:
# create class attributes
car_count = 0
# create class methods
def start(self, name, make, model):
print ("Engine started")
self.name = name
self.make = make
self.model = model
Car.car_count += 1
В приведенном выше скрипте мы создаем класс Car с одним атрибутом класса car_count и тремя атрибутами экземпляра name , make и mode . Класс содержит один метод start () , который содержит три атрибута экземпляра. Значения атрибутов экземпляра передаются в качестве аргументов методу start () . Внутри метода start атрибут car_count увеличивается на единицу.
Важно отметить, что внутри метода атрибуты экземпляра ссылаются с помощью ключевого слова self , а атрибуты класса-с помощью имени класса.
Давайте создадим объект класса Car и вызовем метод start () .
car_a = Car()
car_a.start("Corrola", "Toyota", 2015)
print(car_a.name)
print(car_a.car_count)
В приведенном выше скрипте мы печатаем атрибут экземпляра name и атрибут класса car_count . В выходных данных вы увидите, что атрибут car_count будет иметь значение 1, как показано ниже:
Engine started Corrola 1
Теперь давайте создадим еще один объект класса car и вызовем метод start () .
car_b = Car()
car_b.start("City", "Honda", 2013)
print(car_b.name)
print(car_b.car_count)
Теперь, если вы напечатаете значение атрибута car_count , вы увидите 2 в выходных данных. Это происходит потому, что атрибут car_count является атрибутом класса и, следовательно, является общим для экземпляров. Объект car_a увеличил свое значение до 1, в то время как объект car_b увеличил его снова, следовательно, конечное значение стало 2. Вывод выглядит следующим образом:
Engine started City 2
Методы
Как мы уже говорили ранее, в объектно-ориентированном программировании методы используются для реализации функциональных возможностей объекта. В предыдущем разделе мы создали методы start() и stop() для класса Car . До сих пор мы использовали объекты класса для вызова методов. Однако существует тип метода, который может быть вызван непосредственно с помощью имени класса. Такой метод называется статическим методом.
Статические методы
Чтобы объявить статический метод, необходимо указать дескриптор @staticmethod перед именем метода, как показано ниже:
class Car:
@staticmethod
def get_class_details():
print ("This is a car class")
Car.get_class_details()
В приведенном выше скрипте мы создаем класс Car с одним статическим методом get_class_details() . Давайте назовем этот метод именем класса.
Car.get_class_details()
Вы можете видеть, что нам не нужно было создавать экземпляр класса Car для вызова метода get_class_details () , скорее мы просто использовали имя класса. Важно отметить, что статические методы могут обращаться только к атрибутам class в Python.
Возврат нескольких значений из метода
Одной из лучших особенностей языка Python является способность методов класса возвращать несколько значений. Взгляните на следующий пример:
class Square:
@staticmethod
def get_squares(a, b):
return a*a, b*b
print(Square.get_squares(3, 5))
В приведенном выше скрипте мы создали класс с именем Square с одним статическим методом get_squares() . Метод принимает два параметра; умножает каждый параметр на себя и возвращает оба результата с помощью оператора return . В выводе скрипта выше вы увидите квадраты 3 и 5.
Метод str
До сих пор мы печатали атрибуты с помощью метода print () . Давайте посмотрим, что произойдет, если мы напечатаем объект класса.
Для этого мы создадим простой класс Car с одним методом и попытаемся вывести объект класса на консоль. Выполните следующий сценарий:
class Car:
# create class methods
def start(self):
print ("Engine started")
car_a = Car()
print(car_a)
В приведенном выше скрипте мы создаем car_a объект класса Car и выводим его значение на экран. В основном здесь мы рассматриваем объект car_a как строку. Выход выглядит примерно так:
<__main__.Car object at 0x000001CCCF4335C0>
Выходные данные показывают область памяти, в которой хранится наш объект. Каждый объект Python по умолчанию имеет метод __str__ . При использовании объекта в качестве строки вызывается метод __str__ , который по умолчанию выводит местоположение объекта в памяти. Однако вы также можете предоставить свое собственное определение для метода __str__ . Например, посмотрите на следующий пример:
# Creates class Car
class Car:
# create class methods
def __str__(self):
return "Car class Object"
def start(self):
print ("Engine started")
car_a = Car()
print(car_a)
В приведенном выше сценарии мы переопределяем метод __str__ , предоставляя для него собственное пользовательское определение. Теперь, если вы напечатаете объект car_a , вы увидите сообщение “Car class Object” на консоли. Это сообщение, которое мы напечатали внутри нашего пользовательского метода __str__ .
С помощью этого метода можно создавать пользовательские и более значимые описания для печати объекта. Вы даже можете отобразить некоторые данные внутри класса, например имя человека класса.
Конструкторы
Конструктор-это специальный метод, который вызывается по умолчанию всякий раз, когда вы создаете объект класса.
Чтобы создать конструктор, вы должны создать метод с ключевым словом __init__ . Взгляните на следующий пример:
class Car:
# create class attributes
car_count = 0
# create class methods
def __init__(self):
Car.car_count +=1
print(Car.car_count)
В приведенном выше скрипте мы создаем класс Car с одним атрибутом класса car_count . Класс содержит конструктор, который увеличивает значение car_count и выводит результирующее значение на экран.
Теперь всякий раз, когда будет создан объект класса Car , будет вызываться конструктор, значение car_count будет увеличиваться и отображаться на экране. Давайте создадим простой объект и посмотрим, что получится:
car_a = Car() car_b = Car() car_c = Car()
В выходных данных вы увидите напечатанные значения 1, 2 и 3, так как с каждым объектом значение переменной car_count увеличивается и отображается на экране.
За исключением имени, конструктор можно использовать как обычный метод. Вы можете передавать и получать значения из конструктора. Обычно он используется таким образом, когда вы хотите инициализировать значения атрибутов при создании экземпляра класса.
Локальные и Глобальные переменные
Мы знаем, что существует два типа атрибутов Python: атрибуты экземпляра и атрибуты класса. Атрибуты класса также называются переменными. В зависимости от области действия переменные также можно разделить на два типа: локальные переменные и глобальные переменные.
Локальные переменные
Локальная переменная в классе-это переменная, доступ к которой возможен только внутри блока кода, в котором она определена. Например, если вы определяете переменную внутри метода, она не может быть доступна нигде вне этого метода.
# Creates class Car
class Car:
def start(self):
message = "Engine started"
return message
В приведенном выше скрипте мы создаем локальную переменную message внутри метода start() класса Car . Теперь давайте создадим объект класса Car и попытаемся получить доступ к локальной переменной message , как показано ниже:
car_a = Car() print(car_a.message)
Приведенный выше скрипт вернет следующую ошибку:
AttributeError: 'Car' object has no attribute 'message'
Это происходит потому, что мы не можем получить доступ к локальной переменной вне блока, в котором она определена.
Глобальная переменная
Глобальная переменная определяется вне любого блока кода, например метода, if-операторов и т. Д. Глобальная переменная может быть доступна в любом месте класса. Взгляните на следующий пример.
# Creates class Car
class Car:
message1 = "Engine started"
def start(self):
message2 = "Car started"
return message2
car_a = Car()
print(car_a.message1)
В приведенном выше сценарии мы создали глобальную переменную message1 и напечатали ее значение на экране. В выходных данных вы увидите значение переменной message 1 , напечатанное без ошибки.
Важно отметить, что существует разница между атрибутами класса и экземпляра, а также локальными и глобальными переменными. Атрибуты класса и экземпляра различаются по способу доступа к ним, т. е. По имени класса и имени экземпляра. С другой стороны, локальные и глобальные переменные различаются по своей области действия или, другими словами, по месту доступа к ним. Доступ к локальной переменной возможен только внутри метода. Хотя в этой статье как локальная переменная, так и атрибуты экземпляра определяются внутри метода, локальный атрибут определяется с помощью ключевого слова self.
Модификаторы доступа
Модификаторы доступа в Python используются для изменения области действия переменных по умолчанию. В Python существует три типа модификаторов доступа: public, private и protected.
Переменные с модификаторами открытого доступа могут быть доступны в любом месте внутри или вне класса, частные переменные могут быть доступны только внутри класса, в то время как защищенные переменные могут быть доступны в том же пакете.
Чтобы создать закрытую переменную, вам нужно префиксировать двойные подчеркивания с именем переменной. Чтобы создать защищенную переменную, вам нужно префикс одного подчеркивания с именем переменной. Для открытых переменных вам вообще не нужно добавлять никаких префиксов.
Давайте посмотрим на публичные, частные и защищенные переменные в действии. Выполните следующий сценарий:
class Car:
def __init__(self):
print ("Engine started")
self.name = "corolla"
self.__make = "toyota"
self._model = 1999
В приведенном выше скрипте мы создаем простой класс Car с конструктором и тремя переменными name , make и model . Переменная name является публичной, в то время как переменные make и model объявлены закрытыми и защищенными соответственно.
Давайте создадим объект класса Car и попытаемся получить доступ к переменной name . Выполните следующий сценарий:
car_a = Car() print(car_a.name)
Поскольку name является общедоступной переменной, поэтому мы можем получить доступ к ней вне класса. В выходных данных вы увидите значение для name , напечатанное на консоли.
Теперь попробуем вывести значение переменной make . Выполните следующий сценарий:
print(car_a.make)
В выходных данных вы увидите следующее сообщение об ошибке:
AttributeError: 'Car' object has no attribute 'make'
В последних разделах мы рассмотрели большинство основных концепций объектно-ориентированного программирования. Теперь давайте поговорим о столпах объектно-ориентированного программирования: полиморфизме, наследовании и инкапсуляции, которые в совокупности называются PIE.
Наследование
Наследование в объектно-ориентированном программировании очень похоже на наследование в реальном мире, где ребенок наследует некоторые характеристики от своих родителей, в дополнение к своим собственным уникальным характеристикам.
В объектно-ориентированном программировании наследование означает отношение “ЕСТЬ-Есть”. Например, автомобиль – это транспортное средство. Наследование-одна из самых удивительных концепций объектно-ориентированного программирования, поскольку она способствует повторному использованию кода.
Основная идея наследования в объектно-ориентированном программировании заключается в том, что класс может наследовать характеристики другого класса. Класс, наследующий другой класс, называется дочерним классом или производным классом, а класс, наследуемый другим классом, называется родительским или базовым классом.
Давайте рассмотрим очень простой пример наследования. Выполните следующий сценарий:
# Create Class Vehicle
class Vehicle:
def vehicle_method(self):
print("This is parent Vehicle class method")
# Create Class Car that inherits Vehicle
class Car(Vehicle):
def car_method(self):
print("This is child Car class method")
В приведенном выше сценарии мы создаем два класса Vehicle class и класс Car , который наследует класс Vehicle . Чтобы наследовать класс, вам просто нужно написать имя родительского класса внутри круглой скобки, которая следует за именем дочернего класса. Класс Vehicle содержит метод vehicle_method () , а дочерний класс содержит метод car_method() . Однако, поскольку класс Car наследует класс Vehicle , он также наследует vehicle_method() .
Давайте посмотрим на это в действии. Выполните следующий сценарий:
car_a = Car() car_a.vehicle_method() # Calling parent class method
В приведенном выше скрипте мы создаем объект класса Car и вызываем vehicle_method () , используя этот объект класса Car . Вы можете видеть , что класс Car не имеет никакого vehicle_method () , но поскольку он унаследовал класс vehicle_method () , класс car также может использовать его. Выход выглядит примерно так:
This is parent Vehicle class method
В Python родительский класс может иметь несколько дочерних классов, и аналогично, дочерний класс может иметь несколько родительских классов. Давайте рассмотрим первый сценарий. Выполните следующий сценарий:
# Create Class Vehicle
class Vehicle:
def vehicle_method(self):
print("This is parent Vehicle class method")
# Create Class Car that inherits Vehicle
class Car(Vehicle):
def car_method(self):
print("This is child Car class method")
# Create Class Cycle that inherits Vehicle
class Cycle(Vehicle):
def cycleMethod(self):
print("This is child Cycle class method")
В приведенном выше скрипте родительский Vehicle класс наследуется двумя дочерними классами Car и Cycle . Оба дочерних класса будут иметь доступ к vehicle_method() родительского класса. Выполните следующий сценарий, чтобы увидеть это:
car_a = Car() car_a.vehicle_method() # Calling parent class method car_b = Cycle() car_b.vehicle_method() # Calling parent class method
В выводе вы увидите вывод метода vehicle_method() дважды, как показано ниже:
This is parent Vehicle class method This is parent Vehicle class method
Вы можете видеть, как родительский класс может быть унаследован двумя дочерними классами. Точно так же у ребенка может быть несколько родителей. Давайте взглянем на пример:
class Camera:
def camera_method(self):
print("This is parent Camera class method")
class Radio:
def radio_method(self):
print("This is parent Radio class method")
class CellPhone(Camera, Radio):
def cell_phone_method(self):
print("This is child CellPhone class method")
В приведенном выше сценарии мы создаем три класса: Камера , Радио и Сотовый телефон . Класс Camera и классы Radio наследуются классом CellPhone , что означает, что класс CellPhone будет иметь доступ к методам обоих классов Camera и Radio . Следующий сценарий проверяет это:
cell_phone_a = CellPhone() cell_phone_a.camera_method() cell_phone_a.radio_method()
Выход выглядит примерно так:
This is parent Camera class method This is parent Radio class method
Полиморфизм
Термин полиморфизм буквально означает наличие множества форм. В контексте объектно-ориентированного программирования полиморфизм относится к способности объекта вести себя несколькими способами.
Полиморфизм в программировании реализуется через перегрузку методов и переопределение методов.
Способ Перегрузки
Перегрузка метода относится к свойству метода вести себя по-разному в зависимости от количества или типов параметров. Взгляните на очень простой пример перегрузки метода. Выполните следующий сценарий:
# Creates class Car
class Car:
def start(self, a, b=None):
if b is not None:
print (a + b)
else:
print (a)
В приведенном выше сценарии, если метод start() вызывается путем передачи одного аргумента, параметр будет выведен на экран. Однако если мы передадим 2 аргумента методу start () , он добавит оба аргумента и выведет результат суммы.
Давайте сначала попробуем с одним аргументом:
car_a = Car() car_a.start(10)
На выходе вы увидите 10. Теперь давайте попробуем передать 2 аргумента:
car_a.start(10,20)
На выходе вы увидите 30.
Переопределение метода
Переопределение метода означает наличие метода с тем же именем в дочернем классе, что и в родительском. Определение метода отличается в родительском и дочернем классах, но имя остается тем же. Давайте возьмем простой пример переопределения метода в Python.
# Create Class Vehicle
class Vehicle:
def print_details(self):
print("This is parent Vehicle class method")
# Create Class Car that inherits Vehicle
class Car(Vehicle):
def print_details(self):
print("This is child Car class method")
# Create Class Cycle that inherits Vehicle
class Cycle(Vehicle):
def print_details(self):
print("This is child Cycle class method")
В приведенном выше скрипте классы Car и Cycle наследуют класс Vehicle . Класс vehicle имеет метод print_details () , который переопределяется дочерними классами. Теперь, если вы вызовете метод print_details () , результат будет зависеть от объекта, через который вызывается метод. Выполните следующий сценарий, чтобы увидеть эту концепцию в действии:
car_a = Vehicle() car_a. print_details() car_b = Car() car_b.print_details() car_c = Cycle() car_c.print_details()
Результат будет выглядеть следующим образом:
This is parent Vehicle class method This is child Car class method This is child Cycle class method
Вы можете видеть, что выходные данные отличаются, хотя метод print_details() вызывается через производные классы одного и того же базового класса. Однако, поскольку дочерние классы переопределили метод родительского класса, методы ведут себя по-разному.
Инкапсуляция
Инкапсуляция-это третий столп объектно-ориентированного программирования. Инкапсуляция просто относится к сокрытию данных. Как правило, в объектно-ориентированном программировании один класс не должен иметь прямого доступа к данным другого класса. Скорее всего, доступ должен контролироваться с помощью методов класса.
Для обеспечения контролируемого доступа к данным класса в Python используются модификаторы доступа и свойства. Мы уже видели модификаторы доступа, в этом разделе мы увидим свойства в действии.
Предположим, мы хотим убедиться, что модель автомобиля всегда должна быть между 2000 и 2018 годами. Если пользователь пытается ввести значение меньше 2000 для модели автомобиля, то это значение автоматически устанавливается на 2000, а если введенное значение больше 2018, то оно должно быть установлено на 2018. Если значение находится между 2000 и 2018 годами, оно не должно быть изменено. Мы можем создать свойство для атрибута модели, которое реализует эту логику следующим образом:
# Creates class Car
class Car:
# Creates Car class constructor
def __init__(self, model):
# initialize instance variables
self.model = model
# Creates model property
@property
def model(self):
return self.__model
# Create property setter
@model.setter
def model(self, model):
if model < 2000:
self.__model = 2000
elif model > 2018:
self.__model = 2018
else:
self.__model = model
def getCarModel(self):
return "The car model is " + str(self.model)
carA = Car(2088)
print(carA.getCarModel())
Собственность состоит из трех частей. Вы должны определить атрибут, который является model в приведенном выше скрипте. Затем вы должны определить свойство для атрибута с помощью @property decorator . Наконец, вы должны создать сеттер свойств, который является @model.setter дескриптором в приведенном выше скрипте.
Теперь, если вы попытаетесь ввести значение больше 2018 для атрибута модели, вы увидите, что это значение равно 2018. Давайте проверим это. Выполните следующий сценарий:
car_a = Car(2088) print(car_a.get_car_model())
Здесь мы передаем 2088 в качестве значения для model , однако если вы выведете значение для атрибута model через функцию get_car_model () , то увидите 2018 в выходных данных.
Вывод
В этой статье мы изучили некоторые из наиболее важных концепций объектно-ориентированного программирования. Объектно-ориентированное программирование-одна из самых известных и широко используемых парадигм программирования. Важность объектно-ориентированного программирования проявляется в том, что большинство современных языков программирования либо полностью объектно-ориентированы, либо поддерживают объектно-ориентированное программирование.