Przykład podawany nawet w dokumentacji jako "gotcha" :P
class A:
lista = []
a = A()
# is - sprawdza czy to dokladnie ten sam obiekt
# == porownuje czy obiekty maja rowne wartosci
assert a.lista is A.lista
a.lista.append(1)
A.lista.append(2)
assert a.lista == A.lista and a.lista == [1, 2]
a.lista = []
assert A.lista == [1, 2]
assert a.lista is not A.lista
Twój atrybut data jest tą samą listą dla każdego nowego obiektu. Poprawnie powinieneś zainicjować go w __init__ jako self.data = []
class GroupEarnings:
group_name = ''
def __init__(self, name):
self.group_name = name
To nie ma sensu. Iniciujesz group_name jako statyczny atrybut, czyli taki, który należy do klasy a nie obiektu. Po czym w inicie tworzysz inny atrybut o tej samej nazwie - self.group_name a z GroupEarnings.group_name nigdzie nie korzystasz.
Z uwag to przede wszystkim bardzo dziwne nazewnictwo. Metoda zaczynająca się od get (get_group_earnings) nic nie zwraca, a set_group_earnings zwraca :D. Powinno być na odwrót.
Cała logika wywołana w inicie to też chyba nie najlepszy pomysł. Z zewnątrz nie widać co klasa robi:
ge = GroupEarnings('nazwa grupy')
await ctx.send(ge.msg)
Korzystanie z tej klasy polega na stworzeniu obiektu i pobraniu atrybutu msg? Którego tak na marginesie nazwa też nie jest najlepsza :P.
for x in self.data:
czym jest data, czym jest x. Nie wiem, bo nazwa tego nie mówi.
for i in offers
czemu nie for offer in offers?
self.data.append({'uid': row['value'], 'name': name.split(" (")[0]})
Zamiast robic listę słowników polecam stworzyć na to prostą klase, albo jeszcze lepiej skorzystac z collections.namedtuple:
from collections import namedtuple
Wpis = namedtuple("Wpis", "uid name")
....
self.data.append(Wpis(uid=row['value'], name=name.split(" (")[0]))
iterate += 20
? czemu ta zmienna nazywa sie jakby byla iteratorem pętli a wyglada jakby cos hurtowo liczyła.
Sporo break w pętli nie ułatwia śledzenia jej przebiegu.