Kezdőoldal » Számítástechnika » Programozás » Python OOP, dunder methods....

Python OOP, dunder methods. Meg tudná ezt nekem valaki magyarázni?

Figyelt kérdés

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?



2022. júl. 5. 18:34
 1/3 anonim ***** válasza:

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})"

2022. júl. 5. 20:32
Hasznos számodra ez a válasz?
 2/3 A kérdező kommentje:

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

2022. júl. 5. 21:43
 3/3 anonim ***** válasza:

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

2022. júl. 6. 10:25
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!