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

Python — универсальный язык программирования, который поддерживает различные стили программирования, включая объектно-ориентированное программирование (ООП) с использованием объектов и классов.

Объект — это любая сущность, имеющая атрибуты и поведение. Например, parrot (попугай) — это объект. У него есть:

  • атрибуты — имя, возраст, цвет и т.д.

  • поведение — танцы, пение и т.д.

Аналогично, класс — это чертёж для этого объекта.


Класс и объект в Python

class Parrot:

    # class attribute
    name = ""
    age = 0

# create parrot1 object
parrot1 = Parrot()
parrot1.name = "Blu"
parrot1.age = 10

# create another object parrot2
parrot2 = Parrot()
parrot2.name = "Woo"
parrot2.age = 15

# access attributes
print(f"{parrot1.name} is {parrot1.age} years old")
print(f"{parrot2.name} is {parrot2.age} years old")

Вывод

Blu is 10 years old
Woo is 15 years old

В приведённом примере мы создали класс с именем Parrot с двумя атрибутами: name и age.

Затем мы создаём экземпляры класса Parrot. Здесь parrot1 и parrot2 — это ссылки (значения) на наши новые объекты.

Затем мы получили доступ и присвоили разные значения атрибутам экземпляра, используя имя объекта и нотацию ..

Чтобы узнать больше о классах и объектах, посетите Классы и объекты в Python.


Наследование в Python

Наследование — это способ создания нового класса для использования деталей существующего класса без его изменения.

Вновь созданный класс является производным классом (или дочерним классом). Аналогично, существующий класс — это базовый класс (или родительский класс).

Пример 2: Использование наследования в Python

# base class
class Animal:

    def eat(self):
        print( "I can eat!")

    def sleep(self):
        print("I can sleep!")

# derived class
class Dog(Animal):

    def bark(self):
        print("I can bark! Woof woof!!")

# Create object of the Dog class
dog1 = Dog()

# Calling members of the base class
dog1.eat()
dog1.sleep()

# Calling member of the derived class
dog1.bark();

Вывод

I can eat!
I can sleep!
I can bark! Woof woof!!

Здесь dog1 (объект производного класса Dog) может обращаться к членам базового класса Animal. Это потому, что Dog унаследован от Animal.

# Calling members of the Animal class
dog1.eat()
dog1.sleep()

Чтобы узнать больше о наследовании, посетите Наследование в Python.


Инкапсуляция в Python

Инкапсуляция — одна из ключевых особенностей объектно-ориентированного программирования. Инкапсуляция относится к объединению атрибутов и методов внутри одного класса.

Она предотвращает доступ внешних классов к атрибутам и методам класса и их изменение. Это также помогает достичь сокрытия данных.

В Python мы обозначаем приватные атрибуты, используя подчёркивание в качестве префикса, т.е. одиночное _ или двойное __. Например:

class Computer:

    def __init__(self):
        self.__maxprice = 900

    def sell(self):
        print("Selling Price: {}".format(self.__maxprice))

    def setMaxPrice(self, price):
        self.__maxprice = price

c = Computer()
c.sell()

# change the price
c.__maxprice = 1000
c.sell()

# using setter function
c.setMaxPrice(1000)
c.sell()

Вывод

Selling Price: 900
Selling Price: 900
Selling Price: 1000

В приведённой программе мы определили класс Computer.

Мы использовали метод __init__() для хранения максимальной цены продажи Computer. Обратите внимание на код:

c.__maxprice = 1000

Здесь мы попытались изменить значение __maxprice вне класса. Однако, поскольку __maxprice — это приватная переменная, это изменение не отражается в выводе.

Как показано, чтобы изменить значение, мы должны использовать функцию-сеттер, т.е. setMaxPrice(), которая принимает price в качестве параметра.


Полиморфизм

Полиморфизм — ещё одна важная концепция объектно-ориентированного программирования. Он просто означает более одной формы.

То есть одна и та же сущность (метод, оператор или объект) может выполнять разные операции в разных сценариях.

Рассмотрим пример:

class Polygon:
    # method to render a shape
    def render(self):
        print("Rendering Polygon...")

class Square(Polygon):
    # renders Square
    def render(self):
        print("Rendering Square...")

class Circle(Polygon):
    # renders circle
    def render(self):
        print("Rendering Circle...")

# create an object of Square
s1 = Square()
s1.render()

# create an object of Circle
c1 = Circle()
c1.render()

Вывод

Rendering Square...
Rendering Circle...

В приведённом примере мы создали суперкласс Polygon и два подкласса: Square и Circle. Обратите внимание на использование метода render().

Основная цель метода render() — отрисовать фигуру. Однако процесс отрисовки квадрата отличается от процесса отрисовки круга.

Следовательно, метод render() ведёт себя по-разному в разных классах. Или можно сказать, что render() полиморфен.

Чтобы узнать больше о полиморфизме, посетите Полиморфизм в Python.


Ключевые моменты для запоминания:

  • Объектно-ориентированное программирование делает программу простой для понимания и эффективной.

  • Поскольку класс является разделяемым, код можно повторно использовать.

  • Данные безопасны с абстракцией данных.

  • Полиморфизм позволяет использовать один и тот же интерфейс для разных объектов, поэтому программисты могут писать эффективный код.


Смотрите также:

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