Объектно-ориентированное программирование в 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.
Ключевые моменты для запоминания:
Объектно-ориентированное программирование делает программу простой для понимания и эффективной.
Поскольку класс является разделяемым, код можно повторно использовать.
Данные безопасны с абстракцией данных.
Полиморфизм позволяет использовать один и тот же интерфейс для разных объектов, поэтому программисты могут писать эффективный код.
Смотрите также: