15 KiB
15 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))
<class '__main__.NajprostszaKlasa'>
(Pseudo) Konstruktor
class Punkt:
def __init__(self, x, y):
self.x = x
self.y = y
punkt = Punkt(2, 3)
print(punkt.x)
2
class Figura:
def __init__(self, vertexes):
self.vertexes = vertexes
def liczba_wierzcholkow(self):
return len(self.vertexes)
def dodaj_wierzcholek(self, x):
self.vertexes.append(x)
class Prostokat(Figura):
def __init__(self, vertexes):
super().__init__(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)]))
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(builtins.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)
<__main__.Punkt object at 0x7f728015b358> <__main__.Punkt object at 0x7f728015b4a8> <__main__.Punkt object at 0x7f728015b438>
Atrybuty i metody statyczne
class Klasa:
atrybut = 0
klasa = Klasa()
print(Klasa.atrybut)
print(klasa.atrybut)
0 0
class Klasa:
def __init__(self):
self.t = 0
def metoda():
print("Jestem statyczna!")
Klasa.metoda()
Jestem statyczna!
Wyjątki
with open("nieistniejący_plik.txt") as plik:
content = plik.read()
[0;31m---------------------------------------------------------------------------[0m [0;31mFileNotFoundError[0m Traceback (most recent call last) [0;32m<ipython-input-20-41928d542bef>[0m in [0;36m<module>[0;34m()[0m [0;32m----> 1[0;31m [0;32mwith[0m [0mopen[0m[0;34m([0m[0;34m"nieistniejący_plik.txt"[0m[0;34m)[0m [0;32mas[0m [0mplik[0m[0;34m:[0m[0;34m[0m[0m [0m[1;32m 2[0m [0mprint[0m[0;34m([0m[0mplik[0m[0;34m.[0m[0mread[0m[0;34m([0m[0;34m)[0m[0;34m)[0m[0;34m[0m[0m [0;31mFileNotFoundError[0m: [Errno 2] No such file or directory: 'nieistniejący_plik.txt'
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ący_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ący_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
class MyError(Exception):
def __init__(self, text):
self.text = text
def __str__(self):
return self.text
raise MyError("Coś poszło nie tak!")
[0;31m---------------------------------------------------------------------------[0m [0;31mMyError[0m Traceback (most recent call last) [0;32m<ipython-input-36-4fb306b42ebc>[0m in [0;36m<module>[0;34m()[0m [0;32m----> 1[0;31m [0;32mraise[0m [0mMyError[0m[0;34m([0m[0;34m"Coś poszło nie tak!"[0m[0;34m)[0m[0;34m[0m[0m [0m [0;31mMyError[0m: Coś poszło nie tak!