Cześć, zaczynam dopiero uczyć się pythona, aktualnie jestem na klasach i w celu ćwiczenia chciałem zrobić prostą klasę o "użytkowniku forum", ale mam problem który mnie zatrzymał, a nie bardzo wiem jak ująć ten problem w słowa, aby znaleźć rozwiązanie na necie, dlatego piszę o poradę i wytłumaczenie, dlaczego tak się dzieje
Problem z tym, że w klasie używam zmiennej reputation, którą planowałem, że ma być dynamiczna, zmieniana funkcjami, a kolejna zmienna rank, ma zależeć od wartości reputation. Jednak mimo zmieniania funkcjami wartości reputation, rank zostaje bez zmian, nie rozumiem dlaczego tak się dzieje, mimo że wartość reputation jest aktualizowana i przechowywana, rank sie nie zmienia, tutaj kod (dla samych ifow i ifa z elifami wychodzi tak samo):
class User():
def __init__(self, first, last, reputation=0):
self.first = first
self.last = last
self.reputation = reputation
self.rank = ""
if self.reputation < 0:
self.rank = "Troll"
if self.reputation >= 0 and self.reputation < 10:
self.rank = "Poczatkujacy"
if self.reputation >= 10 and self.reputation < 20:
self.rank = "Bywalec"
if self.reputation >= 20 and self.reputation < 30:
self.rank = "Doświadczony"
if self.reputation >= 30:
self.rank = "Profesjonalista"
def increase_rep(self, x=5):
self.reputation += x
def decrease_rep(self, x=5):
self.reputation -= x
def describe_user(self):
print(f"User {self.first.title()} {self.last.title()} is {self.rank} with {self.reputation} reputation.")
def greet_user(self):
print(f"Welcome {self.first.title()} {self.last.title()}!")
uzytkownik = User("jan", "kowalski")
uzytkownik.describe_user()
uzytkownik.increase_rep(100)
uzytkownik.describe_user()
uzytkownik.reputation = -100
uzytkownik.describe_user()
w konsoli wychodzi:
User Jan Kowalski is Poczatkujacy with 0 reputation.
User Jan Kowalski is Poczatkujacy with 100 reputation.
User Jan Kowalski is Poczatkujacy with -100 reputation.
Rozumiem, że rank jest definiowana na samym początku wywołania klasy, dla domyślnej wartości, ale nie rozumiem dlaczego nie zmienia się,
kiedy zmienimy tę domyślną wartośc. Powinienem może zrobić osobną funckję, która zwraca wartość rank w zależności od rep? Ale dalej nie rozumiem czemu taki sposób nie działa :/
Będę wdzięczny za podpowiedzi co trzeba zmienić i wyjaśnienie dlaczego tak się dzieje!