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

В този урок ще научите за обектно-ориентираното програмиране (OOP) в Python и неговата основна концепция с помощта на примери.

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

Обектно ориентирано програмиране

Python е език за програмиране с много парадигми. Той поддържа различни подходи за програмиране.

Един от популярните подходи за решаване на проблем с програмирането е чрез създаване на обекти. Това е известно като обектно-ориентирано програмиране (OOP).

Обектът има две характеристики:

  • атрибути
  • поведение

Да вземем пример:

Папагалът може да бъде обект, тъй като има следните свойства:

  • име, възраст, цвят като атрибути
  • пеене, танци като поведение

Концепцията за ООП в Python се фокусира върху създаването на код за многократна употреба. Тази концепция е известна още като СУХА (Не се повтаряйте).

В Python концепцията за ООП следва някои основни принципи:

Клас

Класът е план за обекта.

Можем да възприемаме класа като скица на папагал с етикети. Той съдържа всички подробности за името, цветовете, размера и т.н. Въз основа на тези описания можем да изучим папагала. Тук папагалът е обект.

Примерът за клас папагал може да бъде:

 клас Папагал: пас

Тук използваме classключовата дума, за да дефинираме празен клас Parrot. От клас конструираме екземпляри. Екземпляр е специфичен обект, създаден от определен клас.

Обект

Обект (екземпляр) е екземпляр на клас. Когато класът е дефиниран, се дефинира само описанието за обекта. Следователно не е разпределена памет или памет.

Примерът за обект от клас папагал може да бъде:

 obj = папагал ()

Тук 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))

Изход

 Блу е птица Ву също е птица Блу е на 10 години Ву е на 15 години

В горната програма създадохме клас с името Parrot. След това дефинираме атрибути. Атрибутите са характеристика на обект.

Тези атрибути са дефинирани вътре в __init__метода на класа. Това е методът на инициализатора, който първо се изпълнява веднага след създаването на обекта.

След това създаваме екземпляри от класа Parrot. Тук blu и woo са препратки (стойност) към новите ни обекти.

Можем да осъществим достъп до атрибута на класа с помощта на __class__.species. Атрибутите на класа са еднакви за всички екземпляри на клас. По същия начин получаваме достъп до атрибутите на екземпляра, използвайки blu.nameи blu.age. Атрибутите на екземпляра обаче са различни за всеки екземпляр на клас.

За да научите повече за класове и обекти, отидете на Python Classes and Objects

Методи

Методите са функции, дефинирани в тялото на клас. Те се използват за определяне на поведението на даден обект.

Пример 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())

Изход

 Блу пее "Happy" Blu вече танцува

В горната програма дефинираме два метода, т.е. 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 (родителски клас) и Penguin (детски клас). Детският клас наследява функциите на родителския клас. Виждаме това от swim()метода.

Отново детският клас модифицира поведението на родителския клас. Виждаме това от whoisThis()метода. Освен това ние разширяваме функциите на родителския клас, като създаваме нов run()метод.

Освен това използваме super()функцията вътре в __init__()метода. Това ни позволява да стартираме __init__()метода на родителския клас вътре в детския клас.

Капсулиране

Използвайки OOP в 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()

Изход

 Продажна цена: 900 Продажна цена: 900 Продажна цена: 1000

В горната програма дефинирахме Компютърен клас.

Използвахме __init__()метод за съхраняване на максималната продажна цена от Computer. Опитахме се да модифицираме цената. Не можем обаче да го променим, защото Python третира __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)

Изход

 Папагал може да лети Пингвин не може да лети

В горната програма дефинирахме два класа Папагал и Пингвин. Всеки от тях има общ fly()метод. Функциите им обаче са различни.

За да използваме полиморфизъм, създадохме общ интерфейс, т.е. flying_test()функция, която приема всеки обект и извиква fly()метода на обекта . По този начин, когато предадохме blu и peggy обектите във flying_test()функцията, тя работи ефективно.

Основни моменти, които трябва да запомните:

  • Обектно-ориентираното програмиране прави програмата лесна за разбиране, както и ефективна.
  • Тъй като класът е за споделяне, кодът може да се използва повторно.
  • Данните са сигурни и защитени с абстракция на данни.
  • Полиморфизмът позволява един и същ интерфейс за различни обекти, така че програмистите могат да пишат ефективен код.

Интересни статии...