forked from tdwojak/Python2017
20 KiB
20 KiB
Wprowadzenie do Pythona: Klasy
Tomasz Dwojak
3 grudnia 2017
Plan na dziś:
- klasy,
- wyjątki.
Python jest językiem obiektowym
- Wszystko jest obiektem: liczby, napisy, None, funkcje, moduły (biblioteki)...
print((2017).imag)
print(' '.join(['Python', 'da', 'się', 'lubić', '!']))
0 Python da się lubić !
Konstrukcja
class NajprostszaKlasa:
pass
nasza_klasa = NajprostszaKlasa() # Uwaga na nawiasy na końcu!
print(type(nasza_klasa))
nasza_klasa = NajprostszaKlasa # Uwaga na nawiasy na końcu!
print(type(nasza_klasa()))
<type 'instance'> <type 'instance'>
(Pseudo) Konstruktor
class Punkt:
def __init__(self, x, y=0):
self.x = x
self.y = y
# self jak this w C
punkt = Punkt(2)
print(punkt.x)
print(punkt)
2 <__main__.Punkt instance at 0x00000000049B3CC8>
class Figura:
def __init__(self, vertexes):
self.vertexes = vertexes
def liczba_wierzcholkow(self):
return len(self.vertexes)
#metoda - jedynym argumentem jest self
#funkcja -
def dodaj_wierzcholek(self, x):
self.vertexes.append(x)
#dziedziczenie
class Prostokat(Figura):
def __init__(self, vertexes):
super().__init__(vertexes)
#lub self.vertexes = vertexes
def czy_jestem_kwadratem(self):
pass
class Figura:
def __init__(self, vertexes):
self.vertexes = vertexes
def liczba_wierzcholkow(self):
return len(self.vertexes)
def __len__(self):
return self.liczba_wierzcholkow()
len(Figura([Punkt(2,3), Punkt(3,4), Punkt(0, 0)]))
o = Figura([Punkt(2,3), Punkt(3,4), Punkt(0, 0)])
len(o)
o.__len__()
o.liczba_wierzcholkow()
3
Dobre praktyki: komentarze
class Punkt(object):
"""Klasa reprezentująca punkt w 2D."""
def __init__(self, x, y):
"""opis argumentów x i y."""
self.x = x
self.y = y
help(Punkt)
Help on class Punkt in module __main__: class Punkt(__builtin__.object) | Klasa reprezentująca punkt w 2D. | | Methods defined here: | | __init__(self, x, y) | opis argumentów x i y. | | ---------------------------------------------------------------------- | Data descriptors defined here: | | __dict__ | dictionary for instance variables (if defined) | | __weakref__ | list of weak references to the object (if defined)
Enkapsulacja: publiczne czy prywatne?
- Prywatne zaczynają się od dwóch podkreśleń:
__
, np.def __policz(self)
- chronione tylko w konwencji, zaczynają się od '_', np.
def _parse(self)
- publiczne jest wszystko co nie zaczyna się od '_'.
class Parser(object):
def __parse(self): pass
def _get(self): pass
parser = Parser()
parser._get()
parser.__parse()
[0;31m---------------------------------------------------------------------------[0m [0;31mAttributeError[0m Traceback (most recent call last) [0;32m<ipython-input-6-80ee186598d3>[0m in [0;36m<module>[0;34m()[0m [1;32m 4[0m [0mparser[0m [0;34m=[0m [0mParser[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0m [1;32m 5[0m [0mparser[0m[0;34m.[0m[0m_get[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0m [0;32m----> 6[0;31m [0mparser[0m[0;34m.[0m[0m__parse[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0m [0m [0;31mAttributeError[0m: 'Parser' object has no attribute '__parse'
Iteratory
class Figura:
def __init__(self, vertexes):
self.vertexes = vertexes
def __iter__(self):
self.index = -1
return self
def __next__(self):
self.index += 1
if self.index == len(self.vertexes):
raise StopIteration
return self.vertexes[self.index]
for v in Figura([Punkt(2,3), Punkt(3,4), Punkt(0, 0)]):
print(v)
[1;31m[0m [1;31mTypeError[0mTraceback (most recent call last) [1;32m<ipython-input-42-c424f51c19dc>[0m in [0;36m<module>[1;34m()[0m [0;32m 13[0m [1;32mreturn[0m [0mself[0m[1;33m.[0m[0mvertexes[0m[1;33m[[0m[0mself[0m[1;33m.[0m[0mindex[0m[1;33m][0m[1;33m[0m[0m [0;32m 14[0m [1;33m[0m[0m [1;32m---> 15[1;33m [1;32mfor[0m [0mv[0m [1;32min[0m [0mFigura[0m[1;33m([0m[1;33m[[0m[0mPunkt[0m[1;33m([0m[1;36m2[0m[1;33m,[0m[1;36m3[0m[1;33m)[0m[1;33m,[0m [0mPunkt[0m[1;33m([0m[1;36m3[0m[1;33m,[0m[1;36m4[0m[1;33m)[0m[1;33m,[0m [0mPunkt[0m[1;33m([0m[1;36m0[0m[1;33m,[0m [1;36m0[0m[1;33m)[0m[1;33m][0m[1;33m)[0m[1;33m:[0m[1;33m[0m[0m [0m[0;32m 16[0m [1;32mprint[0m[1;33m([0m[0mv[0m[1;33m)[0m[1;33m[0m[0m [1;31mTypeError[0m: instance has no next() method
Atrybuty i metody statyczne
class Klasa:
atrybut = 0
klasa = Klasa()
#klasa2 = Klasa
#klasa2.atrybut=1
print(id(Klasa))
klasa2 = Klasa()
print(id(klasa2))
klasa2.atrybut=1
print(Klasa.atrybut)
#atrybut wspólny dla wszystkich instancji
print(klasa.atrybut)
klasa.temp = []
79384200 48959560 0 0
class Klasa:
def __init__(self):
self.t = 0
def metoda():
# nie będzie działać self.t = 0
print("Jestem statyczna!")
Klasa.metoda()
[1;31m[0m [1;31mTypeError[0mTraceback (most recent call last) [1;32m<ipython-input-62-63152cc2cac6>[0m in [0;36m<module>[1;34m()[0m [0;32m 6[0m [1;32mprint[0m[1;33m([0m[1;34m"Jestem statyczna!"[0m[1;33m)[0m[1;33m[0m[0m [0;32m 7[0m [1;33m[0m[0m [1;32m----> 8[1;33m [0mKlasa[0m[1;33m.[0m[0mmetoda[0m[1;33m([0m[1;33m)[0m[1;33m[0m[0m [0m [1;31mTypeError[0m: unbound method metoda() must be called with Klasa instance as first argument (got nothing instead)
Wyjątki
with open("nieistniejący_plik.txt") as plik:
content = plik.read()
[1;31m[0m [1;31mIOError[0mTraceback (most recent call last) [1;32m<ipython-input-1-1bebecf2f5c5>[0m in [0;36m<module>[1;34m()[0m [1;32m----> 1[1;33m [1;32mwith[0m [0mopen[0m[1;33m([0m[1;34m"nieistniejący_plik.txt"[0m[1;33m)[0m [1;32mas[0m [0mplik[0m[1;33m:[0m[1;33m[0m[0m [0m[0;32m 2[0m [0mcontent[0m [1;33m=[0m [0mplik[0m[1;33m.[0m[0mread[0m[1;33m([0m[1;33m)[0m[1;33m[0m[0m [1;31mIOError[0m: [Errno 2] No such file or directory: 'nieistniej\xc4\x85cy_plik.txt'
from pandas.compat import FileNotFoundError
try:
with open("nieistniejący_plik.txt") as plik:
content = plik.read()
except FileNotFoundError:
contenct = ""
try:
with open("nieistniejący_plik.txt") as plik:
content = plik.read()
except FileNotFoundError as e:
print("Warning {}".format(e))
contenct = ""
Warning [Errno 2] No such file or directory: 'nieistniej\xc4\x85cy_plik.txt'
try:
with open("nieistniejący_plik.txt") as plik:
content = plik.read()
except Exception as e:
print("Warning {}".format(e))
contenct = ""
Warning [Errno 2] No such file or directory: 'nieistniej\xc4\x85cy_plik.txt'
try:
with open("nieistniejący_plik.txt") as plik:
content = plik.read()
except:
contenct = ""
class Figura:
def __init__(self, vertexes):
if len(vertexes) == 0:
raise Exception("Empty list of vertexes")
self.vertexes = vertexes
figura = Figura([])
[1;31m[0m [1;31mException[0mTraceback (most recent call last) [1;32m<ipython-input-19-0884e4d4e2f2>[0m in [0;36m<module>[1;34m()[0m [0;32m 5[0m [0mself[0m[1;33m.[0m[0mvertexes[0m [1;33m=[0m [0mvertexes[0m[1;33m[0m[0m [0;32m 6[0m [1;33m[0m[0m [1;32m----> 7[1;33m [0mfigura[0m [1;33m=[0m [0mFigura[0m[1;33m([0m[1;33m[[0m[1;33m][0m[1;33m)[0m[1;33m[0m[0m [0m [1;32m<ipython-input-19-0884e4d4e2f2>[0m in [0;36m__init__[1;34m(self, vertexes)[0m [0;32m 2[0m [1;32mdef[0m [0m__init__[0m[1;33m([0m[0mself[0m[1;33m,[0m [0mvertexes[0m[1;33m)[0m[1;33m:[0m[1;33m[0m[0m [0;32m 3[0m [1;32mif[0m [0mlen[0m[1;33m([0m[0mvertexes[0m[1;33m)[0m [1;33m==[0m [1;36m0[0m[1;33m:[0m[1;33m[0m[0m [1;32m----> 4[1;33m [1;32mraise[0m [0mException[0m[1;33m([0m[1;34m"Empty list of vertexes"[0m[1;33m)[0m[1;33m[0m[0m [0m[0;32m 5[0m [0mself[0m[1;33m.[0m[0mvertexes[0m [1;33m=[0m [0mvertexes[0m[1;33m[0m[0m [0;32m 6[0m [1;33m[0m[0m [1;31mException[0m: Empty list of vertexes
class MyError(Exception):
def __init__(self, text):
self.text = text
def __str__(self):
return self.text
raise MyError("Coś poszło nie tak!")
[1;31m[0m [1;31mMyError[0mTraceback (most recent call last) [1;32m<ipython-input-34-99f654d8334c>[0m in [0;36m<module>[1;34m()[0m [1;32m----> 1[1;33m [1;32mraise[0m [0mMyError[0m[1;33m([0m[1;34m"Coś poszło nie tak!"[0m[1;33m)[0m[1;33m[0m[0m [0m [1;31mMyError[0m: Coś poszło nie tak!