Triedy a objekty Pythonu (s príkladmi)

V tomto výučbe sa dozviete o základných funkciách objektov a tried v jazyku Python. Dozviete sa, čo je trieda, ako ju vytvárať a používať vo vašom programe.

Video: Triedy a objekty Pythonu

Pythonské objekty a triedy

Python je objektovo orientovaný programovací jazyk. Na rozdiel od procedurálne orientovaného programovania, kde sa hlavný dôraz kladie na funkcie, objektovo orientované programovanie zdôrazňuje objekty.

Objekt je jednoducho súbor údajov (premenných) a metód (funkcií), ktoré na tieto údaje pôsobia. Podobne je trieda vzorom pre tento objekt.

Triedu si môžeme predstaviť ako náčrt (prototyp) domu. Obsahuje všetky podrobnosti o podlahách, dverách, oknách atď. Na základe týchto popisov staviame dom. Dom je objekt.

Pretože z domového plánu domu je možné vyrobiť veľa domov, môžeme z triedy vytvoriť veľa objektov. Objekt sa nazýva aj inštancia triedy a proces vytvárania tohto objektu sa nazýva inštancia .

Definovanie triedy v Pythone

Rovnako ako definície funkcií začínajú kľúčovým slovom def v Pythone, definície tried začínajú kľúčovým slovom triedy.

Prvý reťazec vo vnútri triedy sa nazýva docstring a má stručný popis triedy. Aj keď to nie je povinné, dôrazne sa to odporúča.

Tu je jednoduchá definícia triedy.

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

Trieda vytvorí nový lokálny priestor názvov, kde sú definované všetky jej atribúty. Atribútmi môžu byť údaje alebo funkcie.

Existujú v ňom aj špeciálne atribúty, ktoré začínajú dvojitými podčiarknutiami __. Napríklad __doc__nám dá dokumentáciu k tejto triede.

Hneď ako definujeme triedu, vytvorí sa nový objekt triedy s rovnakým názvom. Tento objekt triedy nám umožňuje prístup k rôznym atribútom a tiež inštanciu nových objektov tejto triedy.

 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ýkon

 10 Toto je trieda osôb

Vytvorenie objektu v Pythone

Videli sme, že objekt triedy je možné použiť na prístup k rôznym atribútom.

Môže sa tiež použiť na vytvorenie nových inštancií objektov (inštancií) tejto triedy. Procedúra na vytvorenie objektu je podobná ako pri volaní funkcie.

 >>> harry = Person()

Týmto sa vytvorí nová inštancia objektu s názvom harry. K atribútom objektov môžeme pristupovať pomocou predpony názvu objektu.

Atribútmi môžu byť údaje alebo metóda. Metódy objektu sú zodpovedajúce funkcie tejto triedy.

To znamená povedať, pretože keďže Person.greetje funkčný objekt (atribút triedy), Person.greetbude objektom metódy.

 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ýkon

  Ahoj 

Možno ste si všimli selfparameter v definícii funkcie vo vnútri triedy, metódu sme však nazvali jednoducho ako harry.greet()bez akýchkoľvek argumentov. Stále to fungovalo.

Je to preto, že kedykoľvek objekt zavolá svoju metódu, samotný objekt sa odovzdá ako prvý argument. Takže harry.greet()prekladá do Person.greet(harry).

Volanie metódy so zoznamom n argumentov je vo všeobecnosti ekvivalentné volaniu príslušnej funkcie so zoznamom argumentov, ktorý sa vytvorí vložením objektu metódy pred prvý argument.

Z týchto dôvodov musí byť prvým argumentom funkcie v triede samotný objekt. Toto sa bežne nazýva ja. Dá sa to pomenovať inak, ale veľmi odporúčame dodržiavať dohovor.

Teraz musíte byť oboznámení s objektom triedy, objektom inštancie, objektom funkcie, objektom metódy a ich rozdielmi.

Konštruktory v Pythone

Funkcie triedy, ktoré sa začínajú dvojitým podčiarkovníkom, __sa nazývajú špeciálne funkcie, pretože majú osobitný význam.

Jednou osobitnou zaujímavosťou je __init__()funkcia. Táto špeciálna funkcia sa zavolá vždy, keď sa vytvorí nový objekt tejto triedy.

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

Akýkoľvek atribút objektu je možné kedykoľvek vymazať pomocou delpríkazu. Vyskúšajte nasledujúci postup v prostredí Python, aby ste videli výstup.

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

Samotný objekt môžeme dokonca vymazať pomocou príkazu del.

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

Je to v skutočnosti komplikovanejšie. Keď to urobíme c1 = ComplexNumber(1,3), v pamäti sa vytvorí nový inštančný objekt a meno c1 sa s ním spojí.

V príkaze del c1je táto väzba odstránená a názov c1 je odstránený z príslušného menného priestoru. Objekt však naďalej existuje v pamäti a ak k nemu nie je viazaný žiadny iný názov, neskôr sa automaticky zničí.

Toto automatické ničenie nereferenčných objektov v Pythone sa nazýva aj odvoz odpadu.

Odstránením objektov v Pythone sa odstráni väzba mien

Zaujímavé články...