Python Classes, používanie metód

Programovacie jazyky, rady, poradňa...
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Python Classes, používanie metód

Príspevok od používateľa Mr-Freek »

Zdravíčko, mám silný pocit že mi dnešná "lekcia" o classes nevošla do hlavy tak ako by mala, tak sem napíšem všetko čo mi nesedí a dúfam že sa niekto zlutuje a pomôže :)

Základný problém tkvie v tom že v programe boli vytvorené 2 classes, a metódy z prvej sú použité aj v druhej. Z vysvetlenia som pochopil že tie metódy sú určené LEN pre daný class a tým to končí, je to teda tak alebo nie? V kóde jasne vidno ako metódy z class CircularDomain (random_pos/normal/inside) sú použité v class Ball.

Druhý problém je vlastne o tom istom, nechápem syntax volania tých domén. Napr. prečo v "self.domain.random_pos(self.radius)" je použité na začiatku self.domain? Rovnako pri "self.domain.normal(self.pos)".

To je všetko nepochopené, nie že by toho bolo málo :D Ďakujem.

class 1
Spoiler

Kód: Vybrať všetko

class CircularDomain:
    def __init__(self, center, radius):
        self.center = center
        self.radius = radius
        self.border = 2
        
    # return if bounding circle is inside the domain    
    def inside(self, center, radius):
        dx = center[0] - self.center[0]
        dy = center[1] - self.center[1]
        dr = math.sqrt(dx ** 2 + dy ** 2)
        return dr < (self.radius - radius - self.border)

    # return a unit normal to the domain boundary point nearest center
    def normal(self, center):
        dx = center[0] - self.center[0]
        dy = center[1] - self.center[1]
        dr = math.sqrt(dx ** 2 + dy ** 2)
        return [dx / dr, dy / dr]
    
    # return random location
    def random_pos(self, radius):
        r = random.random() * (self.radius - radius - self.border)
        theta = random.random() * 2 * math.pi
        x = r * math.cos(theta) + self.center[0]
        y = r * math.sin(theta) + self.center[1]
        return [x, y]
        
    # Draw boundary of domain
    def draw(self, canvas):
        canvas.draw_circle(self.center, self.radius, self.border*2, "Red")
class2
Spoiler

Kód: Vybrať všetko

class Ball:
    def __init__(self, radius, color, domain):
        self.radius = radius
        self.color = color
        self.domain = domain
        
        self.pos = self.domain.random_pos(self.radius) # problem 01
        self.vel = [random.random() + .1, random.random() + .1]
        
    # bounce
    def reflect(self):
        norm = self.domain.normal(self.pos)
        norm_length = dot(self.vel, norm)
        self.vel[0] = self.vel[0] - 2 * norm_length * norm[0]
        self.vel[1] = self.vel[1] - 2 * norm_length * norm[1]
    

    # update ball position
    def update(self):
        self.pos[0] += self.vel[0]
        self.pos[1] += self.vel[1]
        if not self.domain.inside(self.pos, self.radius):   # problem 02
            self.reflect()

    # draw
    def draw(self, canvas):
        canvas.draw_circle(self.pos, self.radius, 1, 
                           self.color, self.color)
notscared
Amateur
Amateur
Príspevky: 12
Registrovaný: 03 aug 2015, 9:42

Re: Python Classes, používanie metód

Príspevok od používateľa notscared »

Z vysvetlenia som pochopil že tie metódy sú určené LEN pre daný class a tým to končí, je to teda tak alebo nie?
Nie. V niektorých jazykoch (C++, C#, Java, ...) metódy (alebo premenné, teda hocijakého člena triedy) označuješ pomocou kľúčového slova, ktoré určuje, kto na daného člena má dosah, napr. v C++ pomocou public - ku členovi je možné sa dostať pomocou hocijakej instancie, private - ku členovi je možné sa dostať iba vnútri metód danej triedy, protected - ku členovi je možné sa dostať z metód danej triedy alebo tried z nej odvodenej

Python nemá nič také. V Pythone sú všetky členy verejné - správajú sa ako spomínaný public. Aby sa do toho zaniesol nejaký poriadok, dohodlo sa, že členy, ktoré chceš skryť budú mať pred sebou podčiarkovník: _my_method(). Napriek tomu ti nič nebráni k ním pristupovať z vonku.
Druhý problém je vlastne o tom istom, nechápem syntax volania tých domén. Napr. prečo v "self.domain.random_pos(self.radius)" je použité na začiatku self.domain? Rovnako pri "self.domain.normal(self.pos)".

Kód: Vybrať všetko

class Ball:
    def __init__(self, radius, color, domain):
        self.radius = radius
        self.color = color
        self.domain = domain
Tu môžeš vidieť, ako sa v konštruktore priradzuje domain ku self.domain. Ku premennným, ktoré patria k danej triede, pristupujeme pomocou self. (self je samotná inštancia objektu, prvý paramater vo všetkých metódach triedy, ako argument je dosadzovaný automaticky Pythonom). self,domain má v tomto prípade byť asi objekt typu CircularDomain. Objekt typu CircularDomain má metódu random_pos(radius). Najprv teda vyberieme objekt typu domain a potom na neho zavoláme metódu, ktorej argument je v tomto prípade člen triedy Ball, teda self.radius:

Kód: Vybrať všetko

self.domain.random_pos(self.radius)
Podobne to platí aj s normal(pos) metódou triedy CircularDomain.

Ak tomu stále nechápeš, odporúčam CodeAcademy kurz, pre mňa to bol veľmi rýchly spôsob ako sa dostať do Pythonu: https://www.codecademy.com/courses/pyth ... -WL8e4/0/1
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Python Classes, používanie metód

Príspevok od používateľa Mr-Freek »

Ok ďakujem za prehľadné vysvetlenie. V lekcií vôbec nespomenuli nič ohľadom prístupnosti tých metód čo má dosť zaráža ale budiž, hlavne že som pochopil a hor sa ďalej! :) S codeacademy som začal ale potom som našiel na coursere peknú sériu kurzov pre python a celkovo algoritmické zmýšlanie, plánujem sa k nemu vrátiť kvôli ostatým jazykom keď bude voľnejšia chvíla. Tak či tak ďakujem ešte raz.
notscared
Amateur
Amateur
Príspevky: 12
Registrovaný: 03 aug 2015, 9:42

Re: Python Classes, používanie metód

Príspevok od používateľa notscared »

Nie je zač.

Neviem ako je to s kurzom na coursere, ale CodeAcademy kurz pre Python je založený primárne na výučbe syntaxe (a nejaké úplne začiatočnícke vysvetlenie programovania). Takže ak máš nejaký problém so syntaxou, odporúčam šup na CodeAcademy si pozrieť náležitú lekciu.
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Python Classes, používanie metód

Príspevok od používateľa Mr-Freek »

Nabudúce vyskúšam, zatiaľ sa mi nestalo že by som od profesorov na coursere niečo nepochopil tak možno som len tentokrát zle počúval. Ale ďakujem za radu, skúšal si aj ostatné jazyky?? Či to stojí za námahu, mne sa to zdalo zvláštne za aký malý čas to do človeka codeacademy natlačí :-)
notscared
Amateur
Amateur
Príspevky: 12
Registrovaný: 03 aug 2015, 9:42

Re: Python Classes, používanie metód

Príspevok od používateľa notscared »

CodeAcademy ti zďaleka nevysvetlí všetku syntax, iba ten základ (a filozofiu) jazyka. Ja som si pozeral od nich okrem Pythonu ešte JQuery (a asi JS, ale to si už presne nepamätám :D ). Ak už vieš programovať, ten jeden kurz od nich prejdeš za jeden, maximálne dva dni. Keď máš základy, zvyšok si už len pozeráš v dokumentácii jazyka/knižnice.

CodeAcademy určite stojí za námahu, keďže tam je minimálna. Píšeš v tom už od prvej minúty, takže nezabíjaš čas siahodlhým vysvetľovaním, ktoré ti je v tom čase nanič.

Malý čas? Ak si už niekedy programoval, základná syntax jazyka za jeden deň je primeraná doba podľa mňa.
Michaelo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: Python Classes, používanie metód

Príspevok od používateľa Michaelo »

Ja som mal tiez problem s Classmi v tom kurze ked som ho robil. To bola jedina vec co som v tom kurze fakt nepochopil. Sice som dalej bol schopny s nimi pracovat, proste som nechapal co a ako a nechapal som ich poriadne az do dnes (ako funguju v Pythone, pouzivat classy som sa naucil v PHP ked som ich potreboval a tam prave mas protected, private a public), takze tiez dakujem za vysvetlenie.
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Python Classes, používanie metód

Príspevok od používateľa Mr-Freek »

S touto myšlienkou základého pochopenia/naštudovania jazyka a potom už len googlenia podľa potrieb sa nestretávam prvý krát takže na tom asi niečo naozaj bude. S pythonom tam som to mal podobne aj bez znalosti programovania, za jeden večer som sa dostal asi na 30% kurzu preto som bol vtedy taký prekvapený :D a to som to všetko pochopil.

Michaelo asi by sa mali na to viac zamerať.. btw ty si prešiel celým tým kurzom čo robia? (6 partov) alebo iba prvú časť o pythone?? Ja sa chystám na všetkých 6 tak aby som nezabil pol roka zbytočne :D
Michaelo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: Python Classes, používanie metód

Príspevok od používateľa Michaelo »

Ja som mal len tu o pythone (zaverecna skuska je vytvorenie hry Asteroids), lebo ked som ho robil ja, tak otvorili iba tento a ostatne mali datum TBD (a TBD/TBA boli stale aj po roku ked som tam dosiel) a ako pozeram otvorili ich az teraz (a ja som ich bohuzial premeskal).
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Python Classes, používanie metód

Príspevok od používateľa Mr-Freek »

Práveže ak by si mal záujem tak 29 augusta začne prvých z tých štyroch ktoré si vynechal. https://www.coursera.org/course/principlescomputing1 ak si to ty neabsolvoval tak mi ostáva len dúfať že to bude stáť zato :)
Michaelo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: Python Classes, používanie metód

Príspevok od používateľa Michaelo »

To by som musel zacat znova aj s tym pyrvym kurzom, kedze som ho robil asi 3 roky dozadu.
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Python Classes, používanie metód

Príspevok od používateľa Mr-Freek »

Ako myslíš :) ja len posúvam ďalej čo viem
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Python Classes, používanie metód

Príspevok od používateľa Mr-Freek »

Ako myslíš :) ja len posúvam ďalej čo viem
Michaelo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: Python Classes, používanie metód

Príspevok od používateľa Michaelo »

JJ vdaka, ja ale aj tak viac vyuzivam v zivote PHP ako Python (ten som pouzil fakt na take "proof of concept" blbosti ktore som aj tak potom napisal v PHP alebo JavaScripte), no a teraz sa sem tam pozriem a skusam C#, lebo niekedy fakt potrebujem spravt nieco co chcem aby bezalo priamo na tvojom PC a nie ako web (hlavne ked to ma citat subory co maju cez 80MB :D).
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Python Classes, používanie metód

Príspevok od používateľa Mr-Freek »

takže lutuješ že si sa python učil?? nestraš mne sa zatiaľ páči :D
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Python Classes, používanie metód

Príspevok od používateľa harrison314 »

Michaelo napísal:JJ vdaka, ja ale aj tak viac vyuzivam v zivote PHP ako Python (ten som pouzil fakt na take "proof of concept" blbosti ktore som aj tak potom napisal v PHP alebo JavaScripte), no a teraz sa sem tam pozriem a skusam C#, lebo niekedy fakt potrebujem spravt nieco co chcem aby bezalo priamo na tvojom PC a nie ako web (hlavne ked to ma citat subory co maju cez 80MB :D).
:D preco nevygooglis nejaky normalny kurz na C#, v cetine je tych serilov plno, napriklad http://www.cs.vsb.cz/behalek/vyuka/pcsh ... index.html
http://www.zive.cz/autori/sc-44/default ... 05&pgnum=1
Michaelo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: Python Classes, používanie metód

Príspevok od používateľa Michaelo »

Lebo na to mam ine video kurzy a ako hovorim, viac vyuzivam PHP ako by som vyuzil C# alebo Python, tak sa to proste len tak neucim ked to ani velmi nepouzijem.
Napísať odpoveď