Класи та об'єкти 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()

Це створить новий екземпляр об’єкта з ім’ям Гаррі. Ми можемо отримати доступ до атрибутів об’єктів, використовуючи префікс імені об’єкта.

Атрибутами можуть бути дані або метод. Методи об'єкта є відповідними функціями цього класу.

Це означає сказати, оскільки 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__()функція. Ця спеціальна функція викликається кожного разу, коли створюється інстанція нового об'єкта цього класу.

This type of function is also called constructors in Object Oriented Programming (OOP). We normally use it to initialize all the variables.

 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)

Output

 2+3j (5, 0, 10) Traceback (most recent call last): File "", line 27, in print(num1.attr) AttributeError: 'ComplexNumber' object has no attribute 'attr'

In the above example, we defined a new class to represent complex numbers. It has two functions, __init__() to initialize the variables (defaults to zero) and get_data() to display the number properly.

An interesting thing to note in the above step is that attributes of an object can be created on the fly. We created a new attribute attr for object num2 and read it as well. But this does not create that attribute for object num1.

Deleting Attributes and Objects

Будь-який атрибут об’єкта можна видалити будь-коли, використовуючи 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 видаляє прив’язку імен

Цікаві статті...