Przypisanie nowej wartości do zmiennej w klasie.

0

Mam taki kod

class Czworobok:
    """"""
    def __init__(self, boki):
        """"""
        assert type(boki) == list and len(boki) == 4, "Podany element nie jest tablica," \
                                                      " lub liczba jej elementow jest rozna od 4"
        boki.sort()
        if boki[-1] >= sum(boki[:-1]):
            raise ValueError("Nie moge utworzyc czworoboku z podanych dlugosci odcinkow!")
        else:
            print "Z podanych dlugosci mozna stworzyc czworobok!"
            self.a = boki[0]
            self.b = boki[1]
            self.c = boki[2]
            self.d = boki[3]

    def set_bok(self, k):
        """Funkcja ustawia nowa wartosc k-temu bokowi
        WYJSCIE: nowa wartosc k-tego boku"""
        assert type(k) == int and 0 <= k <= 3, "Numer n-tego boku musi byc liczba calkowita z przedzialu 0-3"
        dic = {0: self.a, 1: self.b, 2: self.c, 3: self.d}
        x = dic.get(k)
        x = int(raw_input("Podaj nowa wartosc dla boku o podanym numerze\n"))
        return x

    def get_bok(self, n):
        """Funkcja zwraca wartosc n-tego boku
        WYJSCIE: wartosc n-tego boku"""
        assert type(n) == int and 0 <= n <= 3, "Numer n-tego boku musi byc liczba calkowita z przedzialu 0-3"
        boki = [self.a, self.b, self.c, self.d]
        return boki[n]

Nie potrafię stworzyć poprawnej funkcji, która przypisze do odpowiedniej zmiennej self.a, b, c lub d nowej wartości, niby jako return zwraca wartość, którą podałem, ale już w kolejnej funkcji która ma zwracać wartość n-tego boku zwraca wartości podane na początku.

0

Bo chyba nie do końca łapiesz czym są referencje a czym są faktyczne obiekty z wartością. Ty sobie stworzyłeś w tym set_bok mapę WARTOŚCI a nie rerencji. Więc zmiana tego twojego x nie wpływa na wartość self.cośtam. Przykład analogiczny:

x = 1
y = x
y = 2
print (x,y)

Czego byś sie spodziewał w takiej sytuacji? 1,2 czy 2,2?

1

Można troszkę inaczej efekt bardzo podobny, dużo prościej bez zbędnego kombinowania.

class Figura(object):
    
    def __init__(self):
        self.figura = []
    
    def __str__(self):
        if self.figura:
            print "Boki figury"
            rep = ""
            for i in self.figura:
                rep += str(i) + "\t"
        else:
            rep = "<pusta>"
        return rep

    def clear(self):
        self.figura = []

    def add(self, val):
        self.figura.append(val)
    
    def change(self, i, val):
        self.figura[i] = val

    def show_specific_val(self, i):
        return self.figura[i]

f = Figura()
f.add(1)
f.add(2)
f.add(3)
f.add(4)
print f
f.change(2, 6)
print f
print f.show_specific_val(3)
 
0

Dzięki @DolBo zrobiłem na wzór tego co napisałeś, chciałem co prawda nie podawać w argumentach nowej wartości tylko pobierać ją od użytkownika ale w sumie po co komplikować, dzięki! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1