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.greet
jest obiektem funkcji (atrybutem klasy), Person.greet
bę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ś self
parametr 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ą del
instrukcji. 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 c1
to 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.
