Razredi in predmeti Python (z primeri)

V tej vadnici boste spoznali osnovno funkcionalnost objektov in razredov Python. Izvedeli boste, kaj je razred, kako ga ustvariti in uporabiti v svojem programu.

Video: Razredi in predmeti Python

Predmeti in razredi Python

Python je objektno usmerjen programski jezik. Za razliko od postopkovno usmerjenega programiranja, kjer je glavni poudarek na funkcijah, objektno usmerjeno programiranje poudarja predmete.

Predmet je preprosto zbirka podatkov (spremenljivk) in metod (funkcij), ki delujejo na te podatke. Podobno je razred načrt za ta predmet.

Razred si lahko predstavljamo kot skico (prototip) hiše. Vsebuje vse podrobnosti o tleh, vratih, oknih itd. Na podlagi teh opisov gradimo hišo. Hiša je objekt.

Ker je iz načrta hiše mogoče izdelati veliko hiš, lahko iz razreda ustvarimo veliko predmetov. Predmet se imenuje tudi primerek razreda, postopek ustvarjanja tega predmeta pa instantacija .

Določitev razreda v Pythonu

Tako kot se definicije funkcij začnejo s ključno besedo def v Pythonu, se tudi definicije razredov začnejo s ključno besedo razreda.

Prvi niz znotraj razreda se imenuje docstring in ima kratek opis razreda. Čeprav ni obvezno, je to zelo priporočljivo.

Tu je preprosta definicija razreda.

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

Razred ustvari nov lokalni imenski prostor, kjer so definirani vsi njegovi atributi. Atributi so lahko podatki ali funkcije.

V njem so tudi posebni atributi, ki se začnejo z dvojnimi podčrtaji __. Na primer, __doc__nam da dokumentacijo tega razreda.

Takoj, ko definiramo razred, se ustvari nov objekt razreda z istim imenom. Ta objekt razreda nam omogoča dostop do različnih atributov in instanciranje novih predmetov tega razreda.

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

Izhod

 10 To je razred osebe

Ustvarjanje predmeta v Pythonu

Videli smo, da je predmetni razred mogoče uporabiti za dostop do različnih atributov.

Uporablja se lahko tudi za ustvarjanje novih primerkov predmeta (instantacija) tega razreda. Postopek ustvarjanja predmeta je podoben klicu funkcije.

 >>> harry = Person()

To bo ustvarilo nov primerek predmeta z imenom harry. Do atributov predmetov lahko dostopamo s pomočjo predpone imena predmeta.

Atributi so lahko podatki ali metoda. Metode predmeta so ustrezne funkcije tega razreda.

To pomeni reči, ker Person.greetje objekt funkcije (atribut razreda), Person.greetpredmet metode.

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

Izhod

  zdravo 

Mogoče ste opazili selfparameter v definiciji funkcije znotraj razreda, vendar smo metodo poklicali preprosto kot harry.greet()brez kakršnih koli argumentov. Še vedno je delovalo.

To je zato, ker kadar koli objekt pokliče svojo metodo, se sam objekt preda kot prvi argument. Torej, harry.greet()prevede v Person.greet(harry).

In general, calling a method with a list of n arguments is equivalent to calling the corresponding function with an argument list that is created by inserting the method's object before the first argument.

For these reasons, the first argument of the function in class must be the object itself. This is conventionally called self. It can be named otherwise but we highly recommend to follow the convention.

Now you must be familiar with class object, instance object, function object, method object and their differences.

Constructors in Python

Class functions that begin with double underscore __ are called special functions as they have special meaning.

Of one particular interest is the __init__() function. This special function gets called whenever a new object of that class is instantiated.

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

Vsak atribut predmeta lahko kadar koli izbrišete s pomočjo delstavka. Poskusite naslednje na lupini Python, da si ogledate rezultate.

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

Predmet lahko celo izbrišemo z uporabo stavka del.

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

Pravzaprav je bolj zapleteno kot to. Ko to storimo c1 = ComplexNumber(1,3), se v pomnilniku ustvari nov primerek in z njim se veže ime c1.

Na ukaz del c1se ta vezava odstrani, ime c1 pa iz ustreznega imenskega prostora. Predmet pa še naprej obstaja v spominu in če nanj ni vezano nobeno drugo ime, se kasneje samodejno uniči.

To samodejno uničenje neoznačenih predmetov v Pythonu se imenuje tudi zbiranje smeti.

Z brisanjem predmetov v Pythonu se odstrani vezava imena

Zanimive Članki...