Klasy i obiekty Pythona (z przykładami)

W tym samouczku poznasz podstawowe funkcje obiektów i klas Pythona. Dowiesz się, czym jest klasa, jak ją tworzyć i używać w swoim programie.

Wideo: klasy i obiekty języka Python

Obiekty i klasy Pythona

Python to zorientowany obiektowo język programowania. W przeciwieństwie do programowania zorientowanego na procedurę, w którym główny nacisk kładzie się na funkcje, programowanie obiektowe kładzie nacisk na obiekty.

Obiekt to po prostu zbiór danych (zmiennych) i metod (funkcji), które działają na tych danych. Podobnie, klasa jest planem dla tego obiektu.

Możemy myśleć o klasie jako o szkicu (prototypie) domu. Zawiera wszystkie szczegóły dotyczące podłóg, drzwi, okien itp. Na podstawie tych opisów budujemy dom. Dom jest obiektem.

Ponieważ z planu domu można wykonać wiele domów, możemy stworzyć wiele obiektów z jednej klasy. Obiekt jest również nazywany instancją klasy, a proces tworzenia tego obiektu nazywany jest instancją .

Definiowanie klasy w Pythonie

Podobnie jak definicje funkcji zaczynają się od słowa kluczowego def w Pythonie, definicje klas zaczynają się od słowa kluczowego class.

Pierwszy ciąg wewnątrz klasy nazywa się docstring i zawiera krótki opis klasy. Chociaż nie jest to obowiązkowe, jest to wysoce zalecane.

Oto prosta definicja klasy.

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

Klasa tworzy nową lokalną przestrzeń nazw, w której zdefiniowane są wszystkie jej atrybuty. Atrybuty mogą być danymi lub funkcjami.

Są w nim również specjalne atrybuty, które zaczynają się od podwójnego podkreślenia __. Na przykład __doc__daje nam dokumentację tej klasy.

Gdy tylko zdefiniujemy klasę, tworzony jest nowy obiekt klasy o tej samej nazwie. Ten obiekt klasy umożliwia nam dostęp do różnych atrybutów, a także tworzenie instancji nowych obiektów tej klasy.

 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__)

Wynik

 10 To jest klasa osobista

Tworzenie obiektu w Pythonie

Widzieliśmy, że obiekt klasy może służyć do uzyskiwania dostępu do różnych atrybutów.

Może również służyć do tworzenia nowych instancji obiektów (instancji) tej klasy. Procedura tworzenia obiektu jest podobna do wywołania funkcji.

 >>> harry = Person()

Spowoduje to utworzenie nowej instancji obiektu o nazwie harry. Możemy uzyskać dostęp do atrybutów obiektów za pomocą przedrostka nazwy obiektu.

Atrybuty mogą być danymi lub metodą. Metody obiektu są odpowiadającymi funkcjami tej klasy.

Oznacza to, że skoro Person.greetjest obiektem funkcji (atrybutem klasy), Person.greetbędzie obiektem metody.

 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() 

Wynik

  cześć 

Być może zauważyłeś selfparametr w definicji funkcji wewnątrz klasy, ale wywołaliśmy tę metodę po prostu harry.greet()bez żadnych argumentów. Nadal działało.

Dzieje się tak, ponieważ za każdym razem, gdy obiekt wywołuje swoją metodę, sam obiekt jest przekazywany jako pierwszy argument. Więc harry.greet()przekłada się na Person.greet(harry).

Ogólnie, wywołanie metody z listą n argumentów jest równoważne wywołaniu odpowiedniej funkcji z listą argumentów utworzoną przez wstawienie obiektu metody przed pierwszym argumentem.

Z tych powodów pierwszym argumentem funkcji w klasie musi być sam obiekt. Nazywa się to umownie „ja”. Można go nazwać inaczej, ale zalecamy przestrzeganie konwencji.

Teraz musisz znać obiekt klasy, obiekt instancji, obiekt funkcji, obiekt metody i ich różnice.

Konstruktorzy w Pythonie

Funkcje klas rozpoczynające się od podwójnego podkreślenia __nazywane są funkcjami specjalnymi, ponieważ mają specjalne znaczenie.

Szczególnie interesująca jest __init__()funkcja. Ta specjalna funkcja jest wywoływana za każdym razem, gdy tworzony jest nowy obiekt tej klasy.

Ten typ funkcji jest również nazywany konstruktorami w programowaniu obiektowym (OOP). Zwykle używamy go do inicjalizacji wszystkich zmiennych.

 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)

Wynik

 2 + 3j (5, 0, 10) Traceback (ostatnie połączenie ostatnie): Plik „”, wiersz 27, w druku (num1.attr) AttributeError: Obiekt „ComplexNumber” nie ma atrybutu „attr”

W powyższym przykładzie zdefiniowaliśmy nową klasę do reprezentowania liczb zespolonych. Posiada dwie funkcje, __init__()do inicjalizacji zmiennych (domyślnie zero) i get_data()do prawidłowego wyświetlania liczby.

Interesującą rzeczą, na którą należy zwrócić uwagę w powyższym kroku, jest to, że atrybuty obiektu mogą być tworzone w locie. Stworzyliśmy nowy atrybut atr dla obiektu num2 i również go przeczytaliśmy. Ale to nie tworzy tego atrybutu dla obiektu numer1.

Usuwanie atrybutów i obiektów

Każdy atrybut obiektu można usunąć w dowolnym momencie za pomocą delinstrukcji. Spróbuj wykonać następujące czynności w powłoce Pythona, aby zobaczyć dane wyjściowe.

 >>> 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'

Możemy nawet usunąć sam obiekt, używając instrukcji del.

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

Właściwie to jest bardziej skomplikowane. Kiedy to zrobimy c1 = ComplexNumber(1,3), w pamięci tworzony jest nowy obiekt instancji i wiąże się z nim nazwa c1.

W poleceniu del c1to powiązanie jest usuwane, a nazwa c1 jest usuwana z odpowiedniej przestrzeni nazw. Jednak obiekt nadal istnieje w pamięci i jeśli nie jest z nim związana żadna inna nazwa, jest później automatycznie niszczony.

To automatyczne niszczenie obiektów bez odwołań w Pythonie jest również nazywane usuwaniem elementów bezużytecznych.

Usunięcie obiektów w Pythonie usuwa powiązanie z nazwą

Interesujące artykuły...