Třídy a objekty Pythonu (s příklady)

V tomto kurzu se dozvíte o základních funkcích objektů a tříd Pythonu. Dozvíte se, co je to třída, jak ji vytvořit a použít ve vašem programu.

Video: Třídy a objekty Pythonu

Pythonské objekty a třídy

Python je objektově orientovaný programovací jazyk. Na rozdíl od procedurálně orientovaného programování, kde je hlavní důraz kladen na funkce, objektově orientované programování zdůrazňuje objekty.

Objekt je jednoduše soubor dat (proměnných) a metod (funkcí), které na tato data působí. Podobně je třída plánem pro tento objekt.

Třídu si můžeme představit jako náčrt (prototyp) domu. Obsahuje všechny podrobnosti o podlahách, dveřích, oknech atd. Na základě těchto popisů stavíme dům. Dům je objekt.

Jelikož z plánu domu může být vyrobeno mnoho domů, můžeme z třídy vytvořit mnoho objektů. Objekt se také nazývá instance třídy a proces vytváření tohoto objektu se nazývá instance .

Definování třídy v Pythonu

Stejně jako definice funkcí začínají klíčovým slovem def v Pythonu, definice tříd začínají klíčovým slovem třídy.

První řetězec uvnitř třídy se nazývá docstring a má stručný popis třídy. I když to není povinné, je to velmi doporučeno.

Zde je jednoduchá definice třídy.

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

Třída vytvoří nový místní jmenný prostor, kde jsou definovány všechny jeho atributy. Atributy mohou být data nebo funkce.

Existují také speciální atributy, které začínají dvojitými podtržítky __. Například __doc__nám dává dokumentaci této třídy.

Jakmile definujeme třídu, vytvoří se nový objekt třídy se stejným názvem. Tento objekt třídy nám umožňuje přístup k různým atributům a vytváření instancí nových objektů této třídy.

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

Výstup

 10 Toto je třída osob

Vytvoření objektu v Pythonu

Viděli jsme, že objekt třídy lze použít k přístupu k různým atributům.

Lze jej také použít k vytvoření nových instancí objektu (instance) dané třídy. Postup vytvoření objektu je podobný volání funkce.

 >>> harry = Person()

Tím se vytvoří nová instance objektu s názvem harry. K atributům objektů můžeme přistupovat pomocí předpony názvu objektu.

Atributy mohou být data nebo metoda. Metody objektu jsou odpovídajícími funkcemi dané třídy.

To znamená říci, že jelikož Person.greetje objekt funkce (atribut třídy), Person.greetbude objektem 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() 

Výstup

  Ahoj 

Možná jste si všimli selfparametru v definici funkce uvnitř třídy, ale metodu jsme nazvali jednoduše jako harry.greet()bez jakýchkoli argumentů. Stále to fungovalo.

Důvodem je to, že kdykoli objekt zavolá svoji metodu, předá se samotný objekt jako první argument. Takže, harry.greet()se promítá do Person.greet(harry).

Obecně platí, že volání metody se seznamem n argumentů je ekvivalentní volání příslušné funkce se seznamem argumentů, který je vytvořen vložením objektu metody před první argument.

Z těchto důvodů musí být prvním argumentem funkce ve třídě samotný objekt. Tomu se běžně říká já. Může být pojmenován jinak, ale důrazně doporučujeme dodržovat konvenci.

Nyní musíte znát objekt třídy, objekt instance, objekt funkce, objekt metody a jejich rozdíly.

Konstruktory v Pythonu

Funkce třídy, které začínají dvojitým podtržítkem, __se nazývají speciální funkce, protože mají zvláštní význam.

Jedním zvláštním zájmem je __init__()funkce. Tato speciální funkce je volána vždy, když je vytvořen nový objekt dané třídy.

Tento typ funkce se také nazývá konstruktory v objektově orientovaném programování (OOP). Normálně jej používáme k inicializaci všech proměnných.

 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)

Výstup

 2 + 3j (5, 0, 10) Traceback (poslední volání poslední): Soubor "", řádek 27, v tisku (num1.attr) AttributeError: Objekt 'ComplexNumber' nemá atribut 'attr'

Ve výše uvedeném příkladu jsme definovali novou třídu, která představuje komplexní čísla. Má dvě funkce, __init__()inicializovat proměnné (výchozí na nulu) a get_data()správně zobrazit číslo.

Zajímavostí ve výše uvedeném kroku je, že atributy objektu lze vytvářet za běhu. Vytvořili jsme nový atribut attr pro objekt num2 a také jsme jej přečetli. Tím se ale nevytvoří tento atribut pro objekt num1.

Odstranění atributů a objektů

Libovolný atribut objektu lze kdykoli smazat pomocí delpříkazu. Chcete-li zobrazit výstup, vyzkoušejte následující kroky na prostředí 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'

Můžeme dokonce odstranit samotný objekt pomocí příkazu del.

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

Ve skutečnosti je to složitější. Když to uděláme c1 = ComplexNumber(1,3), v paměti se vytvoří nový objekt instance a jméno c1 se s ním váže.

Na příkazu del c1je tato vazba odebrána a název c1 je odstraněn z odpovídajícího oboru názvů. Objekt však nadále existuje v paměti a pokud k němu není vázán žádný jiný název, je později automaticky zničen.

Toto automatické zničení neodkázaných objektů v Pythonu se také nazývá garbage collection.

Odstraněním objektů v Pythonu se odstraní vazba názvu

Zajímavé články...