Informatika2-2013/Gyakorlat10
A MathWikiből
(Változatok közti eltérés)
(Új oldal, tartalma: „== Osztályok == Az osztályok egységbe zárnak és a felesleges információt elrejtik. Például a file objektumaink file típusúak, meg van bennük írva a '''wri…”) |
|||
(egy szerkesztő 16 közbeeső változata nincs mutatva) | |||
1. sor: | 1. sor: | ||
== Osztályok == | == Osztályok == | ||
− | + | *[https://docs.google.com/document/d/1DfqcaiLkpQTjBn2Nh2-CmySvduOJmTHcDKqwsiKRz5I/edit codes in the clouds] | |
− | + | ||
− | + | *Az osztályok egységbe zárnak és a felesleges információt elrejtik. | |
− | + | *Az osztályok metódusokat és változókat tartalmaznak. Metódusokat tekintsük osztályokon belüli függvényeknek. | |
− | + | *Tekintsünk erre úgy, hogy a kód egy részét (mind tárolókat, mind a függvényeket nézve) összefogjuk. | |
− | + | *Egy objektum egy osztály konkrét megvalósítása. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
+ | Egy metódust az alábbi módon definiálunk pythonban: | ||
<python> | <python> | ||
− | + | class Foo: | |
− | + | def setx(self, x): | |
+ | self.x = x | ||
+ | def bar(self): | ||
+ | print self.x | ||
</python> | </python> | ||
− | + | * Itt a lényeges dolog a self változó, ami mindig az első argumentuma a metódusnak. Ez mindig a konkrét megvalósított objektumot jelöli. Tehát külön értékadás nélkül self.x az osztályon (objektumon) belüli x változó, aminek az értékét állítjuk be a setx függvénnyel. | |
− | + | * Az alábbi módon hozhatunk létre objektumokat és hívhatjuk meg azok metódusait: | |
− | + | <Python> | |
− | < | + | f = Foo() |
− | + | f.setx(5) | |
− | + | f.bar() | |
− | + | Foo.setx(f,5) | |
− | + | Foo.bar(f) | |
− | </ | + | </Python> |
− | + | * Fontos, hogy Pythonban futási időben is változhatnak az osztályhoz tartozó változók: | |
− | + | <Python> | |
− | + | del f.x | |
− | < | + | </Python> |
+ | * Itt tehát magát a változót töröljük. | ||
+ | * Minden egyes objektum mögött a háttérben létezik egy szótár, ami tartalmazza az osztály elemeit: | ||
+ | <Python> | ||
+ | g = Foo() | ||
+ | vars(g) | ||
+ | g.__dict__ | ||
+ | </Python> | ||
+ | * Konstruktornak hívjuk azt a metódust, ami az objektum létrehozásával együtt hívódik meg: | ||
+ | <Python> | ||
class Test: | class Test: | ||
def __init__(self): | def __init__(self): | ||
print "Mostmar elhiszed?" | print "Mostmar elhiszed?" | ||
− | + | ||
x = Test() | x = Test() | ||
− | </ | + | </Python> |
+ | * A destruktor konzisztens módon az objektum törlésével együtt hívódik meg. | ||
+ | == Feladatok == | ||
− | + | === 1. feladat === | |
+ | * Változtasd az osztály és objektumszintű változókat az előadásnak megfelelő módon. | ||
+ | * Előadásanyag: [https://docs.google.com/presentation/d/1F1kRViEjY9B-XDJmpJ9uuUQNA8CAnaxE4EFhczo7n70/edit?usp=sharing dia] | ||
<python> | <python> | ||
− | class | + | >>> class A: |
− | + | ... pass | |
− | + | ... | |
− | + | >>> A.v1 = 10 | |
− | x = | + | >>> x=A() # létrehozok két példányt |
− | y = | + | >>> y=A() |
− | x. | + | >>> x.v1 # példányon belül is elérem az osztály szintű változót |
− | y. | + | 10 |
− | + | >>> x.v1 = 34 # itt viszont létrehozok egy példány szintűt aminek a neve felülírja az osztály szintűt | |
− | + | >>> y.v1 | |
− | + | 10 | |
− | + | >>> x.v1 | |
− | # | + | 34 |
+ | >>> A.v1 | ||
+ | 10 | ||
+ | >>> A.v1 = 12 # itt az osztályszintű változót változtatjuk | ||
+ | >>> x.v1 # mivel felülírtuk a v1-t az x példányban így ezen már nincs hatása | ||
+ | 34 | ||
+ | >>> y.v1 | ||
+ | 12 | ||
+ | >>> A.v1 | ||
+ | 12 | ||
</python> | </python> | ||
− | + | === 2. feladat === | |
− | + | [http://math.bme.hu/~kkovacs/info2/matrix_%20resz.py link] | |
− | + | * Írj mátrix osztályt az alábbi metófudokkal: | |
<python> | <python> | ||
− | class | + | class Matrix: |
− | def | + | def const(self,n,x): |
− | + | ... | |
− | + | def zeros(self,n): | |
− | x | + | ... |
− | + | def printer(self): | |
+ | ... | ||
+ | def set(self,i,j,x): | ||
+ | ... | ||
+ | def get(self,i,j): | ||
+ | ... | ||
+ | def hasValue(self,i,j): | ||
+ | ... | ||
+ | def getLine(self,i): | ||
+ | ... | ||
+ | def pow(self): | ||
+ | ... | ||
+ | def product(self,v) | ||
</python> | </python> | ||
− | + | * próbálj meg hibakezelést beépíteni a függvényekbe (try --- except) | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
A lap jelenlegi, 2013. május 2., 23:52-kori változata
Tartalomjegyzék |
Osztályok
- Az osztályok egységbe zárnak és a felesleges információt elrejtik.
- Az osztályok metódusokat és változókat tartalmaznak. Metódusokat tekintsük osztályokon belüli függvényeknek.
- Tekintsünk erre úgy, hogy a kód egy részét (mind tárolókat, mind a függvényeket nézve) összefogjuk.
- Egy objektum egy osztály konkrét megvalósítása.
Egy metódust az alábbi módon definiálunk pythonban:
class Foo: def setx(self, x): self.x = x def bar(self): print self.x
- Itt a lényeges dolog a self változó, ami mindig az első argumentuma a metódusnak. Ez mindig a konkrét megvalósított objektumot jelöli. Tehát külön értékadás nélkül self.x az osztályon (objektumon) belüli x változó, aminek az értékét állítjuk be a setx függvénnyel.
- Az alábbi módon hozhatunk létre objektumokat és hívhatjuk meg azok metódusait:
f = Foo() f.setx(5) f.bar() Foo.setx(f,5) Foo.bar(f)
- Fontos, hogy Pythonban futási időben is változhatnak az osztályhoz tartozó változók:
del f.x
- Itt tehát magát a változót töröljük.
- Minden egyes objektum mögött a háttérben létezik egy szótár, ami tartalmazza az osztály elemeit:
g = Foo() vars(g) g.__dict__
- Konstruktornak hívjuk azt a metódust, ami az objektum létrehozásával együtt hívódik meg:
class Test: def __init__(self): print "Mostmar elhiszed?" x = Test()
- A destruktor konzisztens módon az objektum törlésével együtt hívódik meg.
Feladatok
1. feladat
- Változtasd az osztály és objektumszintű változókat az előadásnak megfelelő módon.
- Előadásanyag: dia
>>> class A: ... pass ... >>> A.v1 = 10 >>> x=A() # létrehozok két példányt >>> y=A() >>> x.v1 # példányon belül is elérem az osztály szintű változót 10 >>> x.v1 = 34 # itt viszont létrehozok egy példány szintűt aminek a neve felülírja az osztály szintűt >>> y.v1 10 >>> x.v1 34 >>> A.v1 10 >>> A.v1 = 12 # itt az osztályszintű változót változtatjuk >>> x.v1 # mivel felülírtuk a v1-t az x példányban így ezen már nincs hatása 34 >>> y.v1 12 >>> A.v1 12
2. feladat
- Írj mátrix osztályt az alábbi metófudokkal:
class Matrix: def const(self,n,x): ... def zeros(self,n): ... def printer(self): ... def set(self,i,j,x): ... def get(self,i,j): ... def hasValue(self,i,j): ... def getLine(self,i): ... def pow(self): ... def product(self,v)
- próbálj meg hibakezelést beépíteni a függvényekbe (try --- except)