Si të përdorni metodat __str__() dhe __repr__() në Python
Prezantimi
Në këtë artikull, do të mësoni rreth metodave speciale __str__()
dhe __repr__()
që janë përcaktuar në modelin e të dhënave Python. Metodat __str__()
dhe __repr__()
mund të jenë të dobishme në korrigjimin e kodit Python duke regjistruar ose shtypur informacione të dobishme rreth një objekti.
Metodat speciale të Python fillojnë dhe përfundojnë me një nënvizim të dyfishtë dhe joformalisht njihen si metodat dunder. Metodat Dunder janë metodat themelore për operatorët dhe funksionet e integruara të Python. Ju duhet të shmangni thirrjen direkte të metodave dunder dhe në vend të kësaj të zbatoni metodat dunder në klasën tuaj dhe më pas të përdorni funksionet e integruara që i thërrasin ato, si str()
dhe repr().
Cili është ndryshimi midis __str__() dhe __repr__()?
Metoda __str__()
kthen një paraqitje të vargut të lexueshëm nga njeriu ose joformale të një objekti. Kjo metodë thirret nga funksionet e integruara print()
, str()
dhe format()
. Nëse nuk përcaktoni një metodë __str__()
për një klasë, atëherë zbatimi i objektit të integruar thërret metodën __repr__()
në vend të kësaj.
Metoda __repr__()
kthen një përfaqësim të vargut më të pasur me informacion ose zyrtar të një objekti. Kjo metodë thirret nga funksioni i integruar repr()
. Nëse është e mundur, vargu i kthyer duhet të jetë një shprehje e vlefshme Python që mund të përdoret për të rikrijuar objektin. Në të gjitha rastet, vargu duhet të jetë informues dhe i paqartë.
Në përgjithësi, vargu __str__()
është i destinuar për përdoruesit dhe vargu __repr__()
është menduar për zhvilluesit.
Shembuj __str__() dhe __repr__() duke përdorur një klasë të integruar
Shembujt në këtë seksion thërrasin metodat __str__()
dhe __repr__()
drejtpërdrejt për qëllime demonstrimi.
Klasa datetime.datetime
është një klasë e integruar Python e cila ka një implementim të paracaktuar të metodave __str__()
dhe __repr__()
.
Kodi i shembullit të mëposhtëm tregon vargjet e kthyera nga zbatimi i paracaktuar i metodave __str__()
dhe __repr__()
për një objekt datetime.datetime
:
import datetime
mydate = datetime.datetime.now()
print("__str__() string: ", mydate.__str__())
print("str() string: ", str(mydate))
print("__repr__() string: ", mydate.__repr__())
print("repr() string: ", repr(mydate))
Prodhimi është:
Output__str__() string: 2023-01-27 09:50:37.429078
str() string: 2023-01-27 09:50:37.429078
__repr__() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)
repr() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)
Dalja tregon se funksioni str()
thërret __str__()
dhe kthen një varg miqësor për njerëzit, ndërsa funksioni repr()
thërret __repr__()
dhe kthen një varg më të pasur me informacion që mund të përdoret për të rikrijuar objektin. Në fakt, mund të përdorni funksionin repr()
me funksionin eval()
për të krijuar një objekt të ri nga vargu:
import datetime
mydate1 = datetime.datetime.now()
mydate2 = eval(repr(mydate1))
print("mydate1 repr() string: ", repr(mydate1))
print("mydate2 repr() string: ", repr(mydate2))
print("the values of the objects are equal: ", mydate1==mydate2)
Prodhimi është:
Outputmydate1 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635)
mydate2 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635)
the values of the objects are equal: True
Kodi i shembullit të mëparshëm krijon objektin mydate2
nga vargu repr()
për mydate1
dhe më pas verifikon që vlerat e të dy objekteve janë të barabarta.
__str__() dhe __repr__() Shembuj duke përdorur një klasë të re
Kur krijoni një klasë, duhet të zbatoni të paktën metodën ___repr__()
në mënyrë që informacioni i dobishëm të kthehet kur funksionet e integruara përdorin __repr__()
.
Klasa e mëposhtme nuk zbaton metodat __str__()
ose __repr()__
:
class Ocean:
def __init__(self, sea_creature_name, sea_creature_age):
self.name = sea_creature_name
self.age = sea_creature_age
c = Ocean('Jellyfish', 5)
print(str(c))
print(repr(c))
Dalja kur përdorni str()
dhe repr()
është:
Output<__main__.Ocean object at 0x102892860>
<__main__.Ocean object at 0x102892860>
Shembulli i mëparshëm tregon se zbatimi i paracaktuar i __repr()__
për objektin kthen një varg me vetëm klasën dhe objektin id
në format heksadecimal, i cili nuk është shumë i dobishëm. . Vini re se str()
dhe repr()
kthejnë të njëjtën vlerë, sepse str()
thërret __repr__()
kur __str__()
nuk zbatohet.
Përditësoni klasën Ocean me implementimet e metodave __str__()
dhe __repr__()
:
class Ocean:
def __init__(self, sea_creature_name, sea_creature_age):
self.name = sea_creature_name
self.age = sea_creature_age
def __str__(self):
return f'The creature type is {self.name} and the age is {self.age}'
def __repr__(self):
return f'Ocean(\'{self.name}\', {self.age})'
c = Ocean('Jellyfish', 5)
print(str(c))
print(repr(c))
Prodhimi është:
OutputThe creature type is Jellyfish and the age is 5
Ocean('Jellyfish', 5)
Zbatimi i __str__()
në shembullin e mëparshëm kthen një varg të lehtë për t'u lexuar që ofron detajet përkatëse të objektit për një përdorues. Implementimi i __repr__()
kthen një varg që është një shprehje e vlefshme Python e cila mund të përdoret për të rikrijuar objektin: Ocean(Jellyfish, 5)
. Shembulli përdor formatimin e vargut f për vargjet, por ju mund të formatoni vargjet duke përdorur çdo format të mbështetur nga Python.
konkluzioni
Në këtë artikull, ju keni eksploruar ndryshimet midis metodave __str__()
dhe __repr__()
dhe keni zbatuar këto metoda speciale në një klasë, kështu që nuk keni pasur nevojë të thirrni direkt. Mësoni më shumë rreth punës me vargje në Python përmes mësimeve tona të vargjeve Python.