Класове и обекти на Python (с примери)

В този урок ще научите за основната функционалност на обектите и класовете на Python. Ще научите какво е клас, как да го създадете и да го използвате във вашата програма.

Видео: Класове и обекти на Python

Обекти и класове на Python

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

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

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

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

Дефиниране на клас в Python

Подобно на дефинициите на функции започват с ключовата дума def в Python, дефинициите на класове започват с ключова дума на класа.

Първият низ в класа се нарича docstring и има кратко описание за класа. Въпреки че не е задължително, това е силно препоръчително.

Ето една проста дефиниция на класа.

 class MyNewClass: '''This is a docstring. I have created a new class''' pass

Клас създава ново локално пространство от имена, където са дефинирани всички негови атрибути. Атрибутите могат да бъдат данни или функции.

В него има и специални атрибути, които започват с двойно подчертаване __. Например __doc__ни дава документацията за този клас.

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

 class Person: "This is a person class" age = 10 def greet(self): print('Hello') # Output: 10 print(Person.age) # Output: print(Person.greet) # Output: 'This is my second class' print(Person.__doc__)

Изход

 10 Това е клас на човек

Създаване на обект в Python

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

Може да се използва и за създаване на нови екземпляри на обекти (инстанциране) на този клас. Процедурата за създаване на обект е подобна на извикване на функция.

 >>> harry = Person()

Това ще създаде нов екземпляр на обект с име harry. Можем да получим достъп до атрибутите на обектите, като използваме префикса на името на обекта.

Атрибутите могат да бъдат данни или метод. Методите на обект са съответните функции на този клас.

Това означава да се каже, тъй като Person.greetе функционален обект (атрибут на клас), Person.greetще бъде обект на метод.

 class Person: "This is a person class" age = 10 def greet(self): print('Hello') # create a new object of Person class harry = Person() # Output: print(Person.greet) # Output:  print(harry.greet) # Calling object's greet() method # Output: Hello harry.greet() 

Изход

  Здравейте 

Може да сте забелязали selfпараметъра в дефиницията на функция вътре в класа, но ние извикахме метода просто като harry.greet()без никакви аргументи. Все пак работеше.

Това е така, защото всеки път, когато обект извика своя метод, самият обект се предава като първи аргумент. Така че, harry.greet()превежда се в Person.greet(harry).

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

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

Сега трябва да сте запознати с обект на клас, обект на екземпляр, обект на функция, обект на метод и техните разлики.

Конструктори в Python

Класовите функции, които започват с двойно подчертаване, __се наричат ​​специални функции, тъй като имат специално значение.

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

Този тип функции се наричат ​​още конструктори в обектно-ориентирано програмиране (OOP). Обикновено го използваме за инициализиране на всички променливи.

 class ComplexNumber: def __init__(self, r=0, i=0): self.real = r self.imag = i def get_data(self): print(f'(self.real)+(self.imag)j') # Create a new ComplexNumber object num1 = ComplexNumber(2, 3) # Call get_data() method # Output: 2+3j num1.get_data() # Create another ComplexNumber object # and create a new attribute 'attr' num2 = ComplexNumber(5) num2.attr = 10 # Output: (5, 0, 10) print((num2.real, num2.imag, num2.attr)) # but c1 object doesn't have attribute 'attr' # AttributeError: 'ComplexNumber' object has no attribute 'attr' print(num1.attr)

Изход

 2 + 3j (5, 0, 10) Проследяване (последно последно повикване): Файл "", ред 27, в печат (num1.attr) AttributeError: 'ComplexNumber' обект няма атрибут 'attr'

В горния пример дефинирахме нов клас, който да представя комплексни числа. Той има две функции, __init__()да инициализира променливите (по подразбиране е нула) и get_data()да показва правилно номера.

Интересно нещо, което трябва да се отбележи в горната стъпка, е, че атрибутите на обект могат да се създават в движение. Създадохме нов атрибут attr за обект num2 и го прочетохме също. Но това не създава този атрибут за обект num1.

Изтриване на атрибути и обекти

Всеки атрибут на обект може да бъде изтрит по всяко време, като се използва delизявлението. Опитайте следното върху обвивката на Python, за да видите резултата.

 >>> num1 = ComplexNumber(2,3) >>> del num1.imag >>> num1.get_data() Traceback (most recent call last):… AttributeError: 'ComplexNumber' object has no attribute 'imag' >>> del ComplexNumber.get_data >>> num1.get_data() Traceback (most recent call last):… AttributeError: 'ComplexNumber' object has no attribute 'get_data'

Можем дори да изтрием самия обект, като използваме оператора del.

 >>> c1 = ComplexNumber(1,3) >>> del c1 >>> c1 Traceback (most recent call last):… NameError: name 'c1' is not defined

Всъщност е по-сложно от това. Когато го направим c1 = ComplexNumber(1,3), в паметта се създава нов екземпляр на обект и името c1 се свързва с него.

По командата del c1това свързване се премахва и името c1 се изтрива от съответното пространство от имена. Обектът обаче продължава да съществува в паметта и ако към него не е свързано друго име, по-късно той автоматично се унищожава.

Това автоматично унищожаване на обекти без препратки в Python се нарича още събиране на боклук.

Изтриването на обекти в Python премахва свързването на имената

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