Python OOP, dunder methods. Meg tudná ezt nekem valaki magyarázni?
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
self.coord = (self.x, self.y)
def __add__(self, other):
return self.x + other.x, self.y + other.y
p1 = Point(3, 5)
p2 = Point(7, -2)
print(p1+p2) # (10, 3)
Ha így returnolok akkor így megkapom ezt az eredményt fent
De ha így:
Point(return self.x + other.x, self.y + other.y)
Akkor ezt kapom:
print(p1+p2) # <__main__.Point object at 0x000001A2DAEF3E20>
Azt tudom, hogy ez memória cím vagy micsoda, ahol a gépen belül ez el van raktározva.
És a kérdés, hogy azzal hogy odaírom elé a class nevét, azzal tulajdonképpen most mit csinálok?
a Point(return self.x + ...) az syntax error...
gondolom arra gondoltál, hogy return Point(self.x + ...)
Ez azért van, mert a print az stringeket tud csak printelni(mi mást írnál a képernyöre, ugye?)... ha valami mást adsz meg neki, mint stringet, akkor azt megpróbálja stringé konvertálni. Objektumok esetén ez úgy történik, hogy meghívja a __repr__ nevü metódust az adott objektumon.
Az elsö példádban egy tuple-t adsz vissza, aminek a repr metódusa úgy van megírva, hogy vesszövel elválasztva felsorolja az elemeket. A másodikban egy Pointal térsz vissza, ami az object-böl örökli a __repr__ metódust, ami kb az osztály nevét meg egy 'memóriacímet' ír ki.
Ha nem tetszik ez a viselkedés, elég, ha felülírod a repr-t, pl valahogy így:
def __repr__(self):
__return f"({self.x}, {self.y})"
igen a return-t úgy gondoltam
szóval ha van egy számom, pl. 3, és ezt ki akarom printelni, akkor a print meghívja ezt a __repr__ metódust ami visszaküld egy stringet "3" és így írja ki? Ha kiírom a print type-ját akkor azt kapom vissza, hogy <class 'builtin_function_or_method'> és ez a __repr__ egy metódusa ennek a classnak. és ez valahogy így nézne ki? print=builtin_function_or_method(), aztán pedig: print.__repr__(3) ?
A második részét nem annyira értem, de azt hiszem rájöttem valami olyanra, hogy ha így küldöm vissza, hogy return Point(...) és ezt hozzárendelem egy változóhoz akkor ez így nézne ki:
p3 = p1 + p2
p3 = Point(self.x + other.y, self.y + other.y)
p3 = Point(10, 3)
ami azt jelenti, hogy csinátam egy új objektet, a Point classon belül, és ezzel együtt a p3-ra már az __init__ method is lefutott és ezután azt csinálok vele amit akarok. és ha ezt simán printelem akkor azért kapom a címet mert csak egy objektet adtam meg. Ez így korrekt ugye?
Nem tudom, ha felül írom a __repr__, akkor az később nem lehet problémás?
Ha simán így akarnám kiírni, akkor hozzáadhatok egy ilyet:
def __str__(self):
__return f"({self.x}, {self.y})"
és így ha objectet printelek a Point classon belül, akkor ő ezt meg fogja hívni.
Illetve most így belegondolva ez ugyan az ...
a __repr__ nem a printen van, hanem a te objektumodon.
a __str__ is müködik, söt, az még jobb is jelen esetben
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!