Nauč se Python > Kurzy > Začátečnický kurz PyLadies > Třídy > Zpětná vazba k domácím projektům

Feedback k domácím projektům

Řešení 1 - obsah lze vypočítat jen jednou a musí být spočten před počítáním rozdílu

In [1]:
class Ctverec:
    def __init__(self, strana):
        self.strana = strana
    def obvod(self):
        self.obvod = 4*self.strana
        return self.obvod
    def obsah(self):
        self.obsah = self.strana**2
        return self.obsah
    def rozdil_obsahu(self, jiny_ctverec):
        return self.obsah - jiny_ctverec.obsah
In [2]:
c1 = Ctverec(5)
c1.obsah()
Out[2]:
25
In [3]:
c1.obsah()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-dd68ddc8112e> in <module>()
----> 1 c1.obsah()

TypeError: 'int' object is not callable
In [4]:
c1 = Ctverec(5)
c2 = Ctverec(10)
c2.rozdil_obsahu(c1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-b2d4f2c61000> in <module>()
      1 c1 = Ctverec(5)
      2 c2 = Ctverec(10)
----> 3 c2.rozdil_obsahu(c1)

<ipython-input-1-cf49bcfaa00b> in rozdil_obsahu(self, jiny_ctverec)
      9         return self.obsah
     10     def rozdil_obsahu(self, jiny_ctverec):
---> 11         return self.obsah - jiny_ctverec.obsah

TypeError: unsupported operand type(s) for -: 'method' and 'method'
In [16]:
c1 = Ctverec(5)
c2 = Ctverec(10)
print(c1.obsah())
print(c2.obsah())
print(c2.rozdil_obsahu(c1))
25
100
75

Řešení 2 - nefunguje dokud nemá ty správné globální proměnné

In [5]:
class Ctverec:
    def __init__(self, strana):
        self.strana = strana

    def obvod(self):
        return 4 * self.strana

    def obsah(self):
        return self.strana ** 2

    def rozdil_obsahu(self, jiny_ctverec):
        return self.obsah() - druhy_ctverec.obsah()
In [6]:
c1 = Ctverec(5)
c2 = Ctverec(10)
c2.rozdil_obsahu(c1)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-6-b2d4f2c61000> in <module>()
      1 c1 = Ctverec(5)
      2 c2 = Ctverec(10)
----> 3 c2.rozdil_obsahu(c1)

<ipython-input-5-745a0cf85edb> in rozdil_obsahu(self, jiny_ctverec)
     10 
     11     def rozdil_obsahu(self, jiny_ctverec):
---> 12         return self.obsah() - druhy_ctverec.obsah()

NameError: name 'druhy_ctverec' is not defined

Řešení 3 - globální proměnné podruhé

In [7]:
class Ctverec:
    def __init__(self, strana):
        self.strana = strana

    def obvod(self):
        obvod = 4 * self.strana
        return obvod

    def obsah(self):
        obsah = self.strana * self.strana
        return obsah

    def rozdil_obsahu(self):
        rozdil = ctverec1.obsah() - ctverec2.obsah()
        return rozdil
In [8]:
c1 = Ctverec(5)
c2 = Ctverec(10)
c2.rozdil_obsahu(c1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-b2d4f2c61000> in <module>()
      1 c1 = Ctverec(5)
      2 c2 = Ctverec(10)
----> 3 c2.rozdil_obsahu(c1)

TypeError: rozdil_obsahu() takes 1 positional argument but 2 were given

Řešení 4 - jiny_ctverec je vlastně délka strany

In [9]:
class Ctverec:
    def __init__(self, strana):
        self.strana = strana

    def obvod(self):
        print(self.strana*4)

    def obsah(self):
        print(self.strana**2)

    def rozdil_obsahu(self, jiny_ctverec):
        self.jiny_ctverec = jiny_ctverec
        print((self.strana**2 - self.jiny_ctverec**2))
In [10]:
c1 = Ctverec(5)
c2 = Ctverec(10)
c2.rozdil_obsahu(c1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-b2d4f2c61000> in <module>()
      1 c1 = Ctverec(5)
      2 c2 = Ctverec(10)
----> 3 c2.rozdil_obsahu(c1)

<ipython-input-9-8c22002c806b> in rozdil_obsahu(self, jiny_ctverec)
     11     def rozdil_obsahu(self, jiny_ctverec):
     12         self.jiny_ctverec = jiny_ctverec
---> 13         print((self.strana**2 - self.jiny_ctverec**2))

TypeError: unsupported operand type(s) for ** or pow(): 'Ctverec' and 'int'

Řešení 5 - jiny_ctverec je vlastně délka strany podruhé

In [11]:
class Ctverec:
    """Trida Ctverec s jednim atributem strana a metodami:
        - obvod()
        - obsah()
        - rozdil_obsahu(jiny_ctverec): 
            vrati rozdil obsahu dvou ctvercu - zadaneho a toho jehoz metodu volame."""
    def __init__(self, strana):
        self.strana = strana
    
    def obvod(self):
        "Vypocet obvodu ctverce"
        self.obvod = self.strana * 4
        print("Ctverec o strane {}cm ma obvod {}cm.".format(self.strana, self.obvod))

    def obsah(self):
        "Vypocet obsahu ctverce"
        self.obsah = self.strana ** 2
        print("Ctverec o strane {}cm ma obsah {}cm2.".format(self.strana, self.obsah))

    def rozdil_obsahu(self, jiny_ctverec):
        "vrati rozdil obsahu dvou ctvercu - zadaneho a toho jehoz metodu volame"
        rozdil = (jiny_ctverec ** 2) - (self.strana ** 2)
        return rozdil

Správné řešení

In [13]:
class Ctverec():
    def __init__(self, strana):
        self.strana = strana

    def obvod(self):
        return 4 * self.strana

    def obsah(self):
        return self.strana ** 2

    def rozdil_obsahu(self, druhy_ctverec):
        return self.obsah() - druhy_ctverec.obsah()

Toto je stránka lekce z kurzu, který probíhá nebo proběhl naživo s instruktorem.