forked from tdwojak/Python2017
10 KiB
10 KiB
Wprowadzenie do Pythona: część 2
Tomasz Dwojak
2 grudnia 2017
Plan na dziś:
- ciąg dalszy podstaw,
- klasy,
- moduły,
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 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)
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-46-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 0x7feb78045908> <__main__.Punkt object at 0x7feb78045828> <__main__.Punkt object at 0x7feb780457f0>
Co zostało pominięte?
- pola klas i metody statyczne,
- dekoratory,
- mutable i immutable