15.1.1 Wykorzystanie instancji klasy jako struktury lub rekordu

class Koło:
  def __init__(self):                   #1
        self.promień  = 1

>>> class Koło:
...     pass
...
>>> moje_koło = Koło()
>>> moje_koło.promień = 5
>>> print(2 * 3.14 * moje_koło.promień)
31.4


>>> moje_koło = Koło()                    #2
>>> print(2 * 3.14 * moje_koło.promień)      #3
6.28
>>> moje_koło.promień = 5                    #4
>>> print(2 * 3.14 * moje_koło.promień)      #5
31.400000000000002

15.3 Metody

>>> class Koło:
...     def __init__(self):
...             self.promień = 1
...     def pole(self):
...             return self.promień * self.promień * 3.14159
...
>>> k = Koło()
>>> k.promień = 3
>>> print(k.pole())
28.27431

>>> print(Koło.pole(k))
28.27431


class Koło:
  def __init__(self, promień):
    self.promień = promień
  def pole(self):
    return self.promień * self.promień * 3.14159


15.4 Zmienne klasy

class Koło:
pi = 3.14159
  def __init__(self, promień):
    self.promień = promień
  def pole(self):
    return self.promień * self.promień * Koło.pi

>>>Koło.pi
3.14159
>>> Koło.pi = 4
>>> Koło.pi
4
>>>Koło.pi = 3.14159
>>> Koło.pi
3.14159



>>> k = Koło(3)
>>> k.pole()
28.27431


>>> Koło
<class '__main__.Koło'>
>>> k.__class__
<class '__main__.Koło'>


>>> k.__class__.pi
3.14159


15.4.1 Zagwozdka związana ze zmiennymi klasy

class Koło:
    pi = 3.14159
    def __init__(self, promień):
        self.promień = promień
    def pole(self):
        return self.promień * self.promień * Koło.pi

>>> k1 = Koło(1)
>>> k2 = Koło(2)
>>> k1.pi = 3.14
>>> k1.pi
3.14
>>> k2.pi
3.14159
>>> Koło.pi
3.14159


15.5.1 Metody statyczne i metody klas

>>> import koło
>>> k1 = koło.Koło(1)
>>> k2 = koło.Koło(2)
>>> koło.Koło.suma_pól()
15.70795
>>> k2.promień = 3
>>> koło.Koło.suma_pól()
31.415899999999997



>>> koło.__doc__
'moduł koło: zawiera klasę Koło'
>>> koło.Koło.__doc__
'klasa Koło'
>>> koło.Koło.pole.__doc__
'liczy pole koła'


15.5.2 Metody klas

>>> import koło_mk
>>> k1 = koło_mk.Koło(1)
>>> k2 = koło_mk.Koło(2)
>>> koło_mk.Koło.suma_pól()
15.70795
>>> k2.promień = 3
>>> koło_mk.Koło.suma_pól()
31.415899999999997

15.5.6 Dziedziczenie

class Kwadrat:
  def __init__(self, bok=1):
    self.bok = bok                         #A


class Kwadrat:
  def __init__(self, bok=1, x=0, y=0):
    self.bok = bok
    self.x = x
    self.y = y
class Koło:
  def __init__(self, promień=1, x=0, y=0):
    self.promień = promień
    self.x = x
    self.y = y


class Figura:
    def __init__(self, x, y):
        self.x = x
        self.y = y


class Kwadrat(Figura):    #A
    def __init__(self, bok=1, x=0, y=0):
        super().__init__(x, y)    #B
        self.bok = bok


class Koło(Figura):    #C
    def __init__(self, promień=1, x=0, y=0):
        super().__init__(x, y)    #D
        self.promień = promień
        self.radius = r


class Figura:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    def przesun(self, delta_x, delta_y):
        self.x = self.x + delta_x
        self.y = self.y + delta_y

class Koło(Figura):    #C
    def __init__(self, promień=1, x=0, y=0):
        super().__init__(x, y)    #D
        self.promień = promień
        self.radius = r

>>> k = figura.Koło(1)
>>> k.przesun(3, 4)
>>> k.x
3
>>> k.y
4

15.7 Dziedziczenie i zmienne klasowe oraz zmienne instancji

class P:
    z = "Witaj"
    def ustaw_p(self):
        self.x = "Klasa P"
    def pokaz_p(self):
        print(self.x)

class C(P):
    def ustaw_c(self):
        self.x = "Klasa C"
    def pokaz_c(self):
        print(self.x)

>>> c = C()
>>> c.ustaw_p()
>>> c.pokaz_p()
Klasa P
>>> c.pokaz_c()
Klasa P
>>> c.ustaw_c()
>>> c.pokaz_c()
Klasa C
>>> c.pokaz_p()
Klasa C

>>> c.z, C.z, P.z
'Witaj'
'Witaj'
'Witaj'

>>> C.z = 'Dzień dobry'
>>> c.z, C.z, P.z
'Dzień dobry'
'Dzień dobry'
'Witaj'

>>> c.z = 'Siema'
>>> c.z, C.z, P.z
'Siema'
'Dzień dobry'
'Witaj'

15.8 Powtórka: podstawy klas w Pythonie

class Figura:
    def __init__(self, x, y):        #A
        self.x = x                   #B
        self.y = y                   #B
    def przesun(self, delta_x, delta_y):  #C
        self.x = self.x + delta_x      #D
        self.y = self.y + delta_y
class Koło(Figura):                                     #A
    pi = 3.14159                                         #B
    wszystkie_koła = []                                  #B
    def __init__(self, promien=1, x=0, y=0):                   #C
        super().__init__(x, y)                           #D
        self.promień = r
        __class__.wszystkie_koła.append(self)               #E
    @classmethod                                         #F
    def suma_pól(cls):
        pole = 0
        for koło in cls.wszystkie_koła:
            pole += cls.pole_koła(circle.promień)       #G
        return pole
    @staticmethod
    def pole_koła(promień):                             #H
        return Koło.pi * promień * promień               #I

>>> k1 = Koło()
>>> k1.promień, k1.x, k1.y
(1, 0, 0)

>>> k2 = Koło(2, 1, 1)
>>> k2.promien, k2.x, k2.y
(2, 1, 1)


>>> k2.przesun(2, 2)
>>> k2.promień, k2.x, k2.y
(2, 3, 3)

>>> Koło.wszystkie_koła
[<Koło object at 0x7f5fad430be0>, <Koło object at 0x7f5fad4042e8>]
>>> [k1, k2]
[<Koło object at 0x7f5fad430be0>, <Koło object at 0x7f5fad4042e8>]


>>> Koło.suma_pól()
15.70795
>>> k2.suma_pól()
15.70795

>>> Koło.pole_koła(k1.promień))
3.14159
>>> k1.pole_koła(k1.promień)
3.14159

15.9 Zmienne i metody prywatne

cclass Moja:
  def __init__(self):
    self.x = 2
    self.__y = 3    #A
  def pokaz_y(self):
    print(self.__y)


>>> m = Moja()

>>> print(m.x)
2


>>> print(m.__y)
Traceback (innermost last):
  File "<stdin>", line 1, in ?
AttributeError: 'Moja' object has no attribute '__y'

>>> m.print_y()
3

>>> dir(m)
['_Moja__y', 'x', ...]

15.10 @property i bardziej elastyczne zmienne instancji

>>> class Temperatura:
...     def __init__(self):
...             self._temp_fahr = 0
...     @property
...     def temp(self):
...             return (self._temp_fahr — 32) * 5 / 9
...
...     @temp.setter
...     def temp(self, nowa_temp):
...             self.temp_fahr = nowa_temp * 9 /5 +32


>>> t = Temperatura()
>>> t.temp_fahr
0
>>> t.temp
—17.77777777777778
>>> t.temp = 34    #1
>>> t.temp_fahr
93.2
>>> t.temp    #2
34.0


15.11 Zasięg i przestrzenie nazw dla instancji klas

>>> import zk
>>> k = zk.K()
>>> k.m()

lokalna przestrzen nazw:  ['lz', 'p', 'self']
parametr: p
lokalna zmienna: lz

globalna przestrzen nazw:  ['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__file__', '__cached__', '__builtins__', 'zm', 'fm', 'KN', 'K']
zmienna modulu: zm
funkcja modulu (moze byc uzywana jak metoda klasy w innych jezykach: fm()

Udostepnia przestrzen nazw instancji, klasy i klasy nadrzednej przez self
Przestrzen nazw instancji:  ['_KN__pkn', '_KN__pknz', '_K__pm', '_K__pzi', '_K__pzk', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm', 'm2', 'mkn', 'pzikn', 'zi', 'zikn', 'zk', 'zkn']
zmienna instancji: self.zi
prywatna zmienna instancji: self.__pzi
zmienna instancji klasy nadrzednej: self.zikn ale korzystaj z KN.zikn do przypisan

Przestrzen nazw klasy: ['_KN__pkn', '_KN__pknz', '_K__pm', '_K__pzk', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm', 'm2', 'mkn', 'zk', 'zkn']
zmienna klasy: self.zk ale korzystaj z K.zikn do przypisan
metoda: self.m2()
prywatna zmienna klasy: self.__pzk ale korzystaj z K.__pzk do przypisan
metoda prywatna: self.__pm()

Przestrzen nazw klasy nadrzednej:  ['_KN__pkn', '_KN__pknz', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'mkn', 'zkn']
metoda klasy nadrzednej: self.mkn()
zmienna klasy nadrzednej: self.zkn



