మాడ్యూల్ పాఠాలు (3/4)
ప్రత్యేక పద్ధతులు (డండర్)
ప్రత్యేక పద్ధతులు (డండర్ పద్ధతులు ఎందుకంటే అవి ప్రారంభమవుతాయి మరియు ముగుస్తాయి
డబుల్ అండర్స్కోర్తో: __name__) మీ వస్తువులను అనుమతించే హుక్స్
భాషతో ఏకీకరణ: వచన ప్రాతినిధ్యం, ==తో పోలిక,
len(), in, ఆపరేటర్లు మొదలైన వాటికి మద్దతు.
మీరు ఇప్పటికే ఒకదాన్ని ఉపయోగించారు: __init__.
__str__ మరియు __repr__
వారు print()తో మరియు REPLలో కనిపించే వాటిని నియంత్రిస్తారు.
class Punto:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"Punto({self.x}, {self.y})"
def __str__(self):
return f"({self.x}, {self.y})"
p = Punto(3, 4)
str(p) # '(3, 4)' — per umani
repr(p) # 'Punto(3, 4)' — per debugger / dev
print(p) # '(3, 4)'
p # Punto(3, 4) in REPL → repr
[p, p] # [Punto(3, 4), Punto(3, 4)] — sempre repr nei contenitoriమీరు __repr__ని మాత్రమే నిర్వచిస్తే, పైథాన్ దానిని ఫాల్బ్యాక్గా కూడా ఉపయోగిస్తుంది
__str__.
__eq__: పునర్నిర్వచనం ==
డిఫాల్ట్గా a == b ఆబ్జెక్ట్ల ఐడెంటిఫైయర్లను పోల్చింది (is), కాదు
వారి విషయాలు. నిర్మాణాత్మక పోలిక కోసం, __eq__ని నిర్వచించండి:
class Punto:
def __init__(self, x, y):
self.x, self.y = x, y
def __eq__(self, other):
if not isinstance(other, Punto):
return NotImplemented
return (self.x, self.y) == (other.x, other.y)
Punto(1, 2) == Punto(1, 2) # True
Punto(1, 2) == Punto(3, 4) # Falseరకాలుగా ఉన్నప్పుడు NotImplemented (ప్రత్యేక కీవర్డ్, False కాదు!) తిరిగి వస్తుంది
పోల్చదగినది కాదు అనేది సరైన అభ్యాసం: పైథాన్ దానితో ప్రయత్నిస్తుంది
ఇతర ఒపెరాండ్ __eq__.
__len__: len()కి మద్దతు
class Cesto:
def __init__(self):
self.frutti = []
def __len__(self):
return len(self.frutti)
c = Cesto()
c.frutti.append("mela")
len(c) # 1
bool(c) # True (len > 0)__len__ని నిర్వచించడం ద్వారా, మీరు బూలియన్ని కూడా ఉచితంగా పొందుతారు: ఒక వస్తువు
len() == 0తో తప్పుగా మారుతుంది.
ఇతర ఉపయోగకరమైన డండర్లు (అవలోకనం)
__add__(self, other)→+ని పునర్నిర్వచించింది__lt__,__le__,__gt__,__ge__→ పోలిక ఆపరేటర్లు__contains__(self, item)→item in selfకి మద్దతు ఇస్తుంది__iter__+__next__→ ఆబ్జెక్ట్ను మళ్లించేలా చేస్తుంది__getitem__(self, key)→self[key]కి మద్దతు ఇస్తుంది__hash__→ డిక్ట్ కీ / సెట్ ఎలిమెంట్గా ఉండాలి
మీ వంతు
__init__(స్వీయ, మొత్తం, కరెన్సీ)తో `మనీ`ని నిర్వచించండి మరియు `f'{amount} {currency}'`ని తిరిగి ఇచ్చే __str__. `s = Money(42, 'EUR')`ని సృష్టించండి మరియు `str(s)`ని మూల్యాంకనం చేయండి.
సూచనను చూపించు
__str__లో f-స్ట్రింగ్.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
వ్యాయామం సమీక్షించండి
(a, b) యొక్క నిర్మాణాత్మక పోలిక ఆధారంగా __init__(self, a, b) మరియు __eq__తో `పెయిర్`ని నిర్వచించండి. `జత(1, 2) == జత(1, 2)`ని మూల్యాంకనం చేయండి.
సూచనను చూపించు
టుపుల్స్ (self.a, self.b) == (other.a, other.b) సరిపోల్చండి.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
అదనపు సవాలు
\`టైటిల్\` మరియు \`రచయిత\`ని తీసుకునే కన్స్ట్రక్టర్తో క్లాస్ \`బుక్\`ని నిర్వచించండి. \`__str__(self)\` అనే ప్రత్యేక పద్ధతిని నిర్వచించండి, కనుక ఇది \`"రచయిత ద్వారా శీర్షిక"\` (ఉదా. \`'1984 by జార్జ్ ఆర్వెల్'\`) స్ట్రింగ్ను అందిస్తుంది. పుస్తకాన్ని తక్షణమే చేసి, \`str(పుస్తకం)\`ని మూల్యాంకనం చేయండి.
సూచనను చూపించు
def __str__(self) లోపల {self.author}" ద్వారా f"{self.title}ని ఉపయోగించండి:.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది