Объектно-ориентированное программирование Python
Объектно-ориентированное программирование на Python
В этом руководстве вы узнаете об объектно-ориентированном программировании (ООП) в Python и его фундаментальной концепции с помощью примеров.
Видео:объектно-ориентированное программирование на Python
Объектно-ориентированное программирование
Python — мультипарадигмальный язык программирования. Он поддерживает различные подходы к программированию.
Одним из популярных подходов к решению проблемы программирования является создание объектов. Это известно как объектно-ориентированное программирование (ООП).
Объект имеет две характеристики:
- атрибуты
- поведение
Возьмем пример:
Попугай — это объект, так как он имеет следующие свойства:
- имя, возраст, цвет как атрибуты
- пение, танец как поведение
Концепция ООП в Python фокусируется на создании повторно используемого кода. Эта концепция также известна как DRY (не повторяйтесь).
В Python концепция ООП следует некоторым основным принципам:
<час>Класс
Класс — это план объекта.
Мы можем думать о классе как о наброске попугая с ярлыками. Он содержит все подробности об имени, цветах, размерах и т. д. На основе этих описаний мы можем узнать о попугае. Здесь попугай — это объект.
Примером класса попугаев может быть:
class Parrot: pass
Здесь мы используем class
ключевое слово для определения пустого класса Parrot . Из класса мы создаем экземпляры. Экземпляр — это конкретный объект, созданный из определенного класса.
Объект
Объект (экземпляр) — это экземпляр класса. Когда класс определен, определяется только описание объекта. Таким образом, память или хранилище не выделяются.
Примером объекта класса попугаев может быть:
obj = Parrot()
Здесь obj является объектом класса Parrot
.
Предположим, у нас есть детали попугаев. Теперь мы собираемся показать, как построить класс и объекты попугаев.
Пример 1. Создание класса и объекта в Python
class Parrot:
# class attribute
species = "bird"
# instance attribute
def __init__(self, name, age):
self.name = name
self.age = age
# instantiate the Parrot class
blu = Parrot("Blu", 10)
woo = Parrot("Woo", 15)
# access the class attributes
print("Blu is a {}".format(blu.__class__.species))
print("Woo is also a {}".format(woo.__class__.species))
# access the instance attributes
print("{} is {} years old".format( blu.name, blu.age))
print("{} is {} years old".format( woo.name, woo.age))
Вывод
Blu is a bird Woo is also a bird Blu is 10 years old Woo is 15 years old
В приведенной выше программе мы создали класс с именем Parrot. . Затем мы определяем атрибуты. Атрибуты являются характеристикой объекта.
Эти атрибуты определены внутри __init__
метод класса. Это метод инициализации, который запускается сразу после создания объекта.
Затем мы создаем экземпляры Parrot учебный класс. Вот, голубой и ууу являются ссылками (значением) на наши новые объекты.
Мы можем получить доступ к атрибуту класса, используя __class__.species
. Атрибуты класса одинаковы для всех экземпляров класса. Точно так же мы получаем доступ к атрибутам экземпляра, используя blu.name
и blu.age
. Однако атрибуты экземпляра различны для каждого экземпляра класса.
Дополнительные сведения о классах и объектах см. в разделе Классы и объекты Python
. <час>Методы
Методы — это функции, определенные внутри тела класса. Они используются для определения поведения объекта.
Пример 2. Создание методов в Python
class Parrot:
# instance attributes
def __init__(self, name, age):
self.name = name
self.age = age
# instance method
def sing(self, song):
return "{} sings {}".format(self.name, song)
def dance(self):
return "{} is now dancing".format(self.name)
# instantiate the object
blu = Parrot("Blu", 10)
# call our instance methods
print(blu.sing("'Happy'"))
print(blu.dance())
Вывод
Blu sings 'Happy' Blu is now dancing
В приведенной выше программе мы определяем два метода, то есть sing()
и dance()
. Они называются методами экземпляра, потому что они вызываются для объекта экземпляра, т.е. blu
.
Наследование
Наследование — это способ создания нового класса для использования деталей существующего класса без его изменения. Вновь сформированный класс является производным классом (или дочерним классом). Точно так же существующий класс является базовым классом (или родительским классом).
Пример 3. Использование наследования в Python
# parent class
class Bird:
def __init__(self):
print("Bird is ready")
def whoisThis(self):
print("Bird")
def swim(self):
print("Swim faster")
# child class
class Penguin(Bird):
def __init__(self):
# call super() function
super().__init__()
print("Penguin is ready")
def whoisThis(self):
print("Penguin")
def run(self):
print("Run faster")
peggy = Penguin()
peggy.whoisThis()
peggy.swim()
peggy.run()
Вывод
Bird is ready Penguin is ready Penguin Swim faster Run faster
В приведенной выше программе мы создали два класса, т. е. Bird. (родительский класс) и Penguin (детский класс). Дочерний класс наследует функции родительского класса. Мы можем видеть это из swim()
метод.
Опять же, дочерний класс изменил поведение родительского класса. Мы можем видеть это по whoisThis()
метод. Кроме того, мы расширяем функции родительского класса, создавая новый run()
метод.
Кроме того, мы используем super()
функция внутри __init__()
метод. Это позволяет нам запустить __init__()
метод родительского класса внутри дочернего класса.
Инкапсуляция
Используя ООП в Python, мы можем ограничить доступ к методам и переменным. Это предотвращает прямую модификацию данных, которая называется инкапсуляцией. В Python мы обозначаем частные атрибуты, используя подчеркивание в качестве префикса, т.е. одиночный _
или двойной __
.
Пример 4. Инкапсуляция данных в 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()
который принимает цену в качестве параметра.
Полиморфизм
Полиморфизм — это возможность (в ООП) использовать общий интерфейс для нескольких форм (типов данных).
Предположим, нам нужно раскрасить фигуру, есть несколько вариантов формы (прямоугольник, квадрат, круг). Однако мы могли бы использовать тот же метод, чтобы раскрасить любую фигуру. Эта концепция называется полиморфизмом.
Пример 5. Использование полиморфизма в Python
class Parrot:
def fly(self):
print("Parrot can fly")
def swim(self):
print("Parrot can't swim")
class Penguin:
def fly(self):
print("Penguin can't fly")
def swim(self):
print("Penguin can swim")
# common interface
def flying_test(bird):
bird.fly()
#instantiate objects
blu = Parrot()
peggy = Penguin()
# passing the object
flying_test(blu)
flying_test(peggy)
Вывод
Parrot can fly Penguin can't fly
В приведенной выше программе мы определили два класса Parrot. и Пингвин . У каждого из них есть общий fly()
метод. Однако их функции различны.
Чтобы использовать полиморфизм, мы создали общий интерфейс, например flying_test()
. функция, которая принимает любой объект и вызывает fly()
объекта метод. Таким образом, когда мы прошли blu и пегги объекты в flying_test()
функции, она работала эффективно.
Ключевые моменты, которые следует помнить:
- Объектно-ориентированное программирование делает программу простой для понимания и эффективной.
- Поскольку класс доступен для совместного использования, код можно использовать повторно.
- Данные надежно защищены благодаря абстракции данных.
- Полиморфизм позволяет использовать один и тот же интерфейс для разных объектов, поэтому программисты могут писать эффективный код.
Python