Рубрики
Без рубрики

Объектно-ориентированное программирование на Python

Автор оригинала: Usman Malik.

Объектно-ориентированное программирование на 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 в выходных данных.

Вывод

В этой статье мы изучили некоторые из наиболее важных концепций объектно-ориентированного программирования. Объектно-ориентированное программирование-одна из самых известных и широко используемых парадигм программирования. Важность объектно-ориентированного программирования проявляется в том, что большинство современных языков программирования либо полностью объектно-ориентированы, либо поддерживают объектно-ориентированное программирование.