Python-ban mit jelent ez a "r" betű a special/magic/dunder methods-nél?
Otthon tanulok magamtól programozni, és itt elakadtam.
Simán magát ezeket a dunder (vagy ki hogy ismeri) methods-öket valamennyire felfogtam. Lényegében annyi, hogy van egy method pl. __add__() és ezt a classon kívül úgy tudom meghívni, hogy összeadok 2 objectet (itt az nem tiszta, hogy a 2 objectnek 1 classban kell-e lennie, mert úgy is lefutott a kód, ha 2 külön class-ba volt, és nem volt öröklődés) És valójában a method-ön belül tökmindegy hogy mit csinálok, nem muszály összeadásnak lennie, akár lehet kivonás is, vagy egy sima print(), csak ahhoz hogy meghívjam, a 2 objectet össze kell adni a classon kívül, és akkor ami ott a method-be le van írva, az lefut. De javítsatok ki ha nem így van, tökéletesen még nem sikerült felfognom.
Aztán jött ez az "r" betűs rész, ahol annyit sikerült felfognom, hogy amikor magát leírom, hogy x + y az azt jelenti, hogy x.__add__(y).
És ha x és y nem egy type-ba van benne, akkor utána maga a rendszer megnézi, hogy az x.__radd()__(y) methoddel működik-e. Itt gondolom a type az azt jelenti hogy int, str, float stb. Úgyhogy csináltam egy olyat, hogy str.__rmul__(int) és így le is futott a dolog. Aztán megnéztem fordítva is int.__rmul__(str) és ekkor azt írta ki, hogy NotImplemented (de nem hibaüzenetként) Gondolom azért mert egy számot nem tudom szövegszer kiírni, holott ha simán azt csinálom, hogy print(str*int) vagy print(int*str) mindkét esetben működik. Lehet hülyeség az egész amit leírtam, kb. ezt sikerült felfognom.
Ui. Ezeket a dunder methods_öket gyakran kell használni, vagy legalábbis ezt az "r"-betűs részét? Meg nemtudom, ez nehéznek számít gondolom, ugye? Keresgéltem youtube-on és az 1. videóra ami feljött nagybetűvel ki volt írva, hogy EXPERT. De végül olyat nem találtam, ahol erről az r-betűről lenne szó.
Már azt is köszönöm, ha végig olvastad. Ha meg válaszolni is tudsz rá, hát akkor nem tudom ...
milyen r betűs rész? nem értem hol találkoztál itt r betűvel
python dinamikus tipusokat használ ezért ha felül szeretnél definiálni egy operátort két különböző tipus között akkor néha rá kell szürnöd a tipusára hogy a megfelelő műveleteket végezd el minden olyan tipusra amit támogatni akarsz
nem túlzottan komplikált ez, én olyan alap/középszint közzé saccolnám
akkor használsz ilyesmit ha szeretnéd hogy valamelyik osztályodra értelmezett legyen valamelyik beépített operátor vagy függvény mert így intuitivabb a használata. pl ha vektorokkal dolgozol akkor a + b * 2 sokkal érthetőb mint a.add(b.multiply(2)) függvéyneket használnád
Ez a weboldal nagyon jól leírta a dolgokat, meg is értettem, köszönöm!
Még egy olyan kérdésem lenne, hogy ha egyszerre több objektet adok össze, akkor az így hogyan működik?
def __add__(self, other):
___ return ClassName(self.obj + other.obj)
total = a + b + c + d (a,b,c,d bent van a classba)
print(total.obj)
és ez le is fut meg minden, de hogy az __add__()-ban 2 argument van, a self és az other, de és több értéket teszek bele. Akkor az 1. lesz a self és a többi az other, vagy hogyan?
ha megnézel egy __add__ metódust a cikkben amit linkeltem, akkor elég jól fog látszódni.
def __add__(self, otherWeight):
....return Weight(self.kilos + otherWeight.kilos)
Szóval ha összeadsz három súlyt a + b + c akkor először b + c hajtódik végre aminek eredménye egy júj obj. majd ezt adod hozzá az a-hoz. Szóval a + b + c ekvivalens ezzel:
a.__add__(b.__add__(c))
kipróbáltam úgy hogy 'a' egy ineteger, és így meg is bukott, amit értek is, mert integerhez nem lehet objectet adni, csak fordítva
aztán kipróbáltam úgy is, hogy 'b' az integer, és akkor a b.__add__(c)-ben a 'b'-hez nem kellene hozzáadni a 'c' objectet, de ennek ellenére tökéletesen lefutott
aztán most hogy így gondolkoztam, az nem lehet hogy pont fordítva van, hogy balról halad jobb?
(a.__add__(b)).__add__(c)
így ha 'a' az integer, akkor megbukik, ahogy meg is kell neki
ha a 'b' az integer, akkor pedig beteszünk egy
if type(other) == int:
...return Weight(self.kilos + other)
és akkor így hozzá tudja adni az 'a' objecthez
a 'c'-nél meg ugyanez
jól mondod, +- nál left to right a sorrend
Köszönöm, most már akkor értek mindent!
Amúgy milyen érdekes hogy a 2**3**2 nem egyenlő a matekban a 2^3^2-val :D
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, 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!