Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

self or not self

0 votes

Je viens de coder une petite classe et je cherche a comprendre le concept d'instance (self).
Je me demande s'il faut mettre des self à toutes les variables même si la variable est propre à la méthode et n'en sort pas.

class CalculCompta(object):
"Générateur des différents calculs pour la compta"

def __init__(self, datas, col_date, col_cat, col_montant, col_moyens):
    self.datas = datas
    # Permet d'obtenir les mois
    self.col_date = col_date
    self.months = np.ndarray.tolist(self.datas[col_date].unique())
    # Permet d'obtenir les catégories
    self.col_cat = col_cat
    self.categories = np.ndarray.tolist(self.datas[col_cat].unique())
    self.montants = col_montant
    # Permet d'obtenir la liste des moyens
    self.col_moyens = col_moyens
    self.moyens = np.ndarray.tolist(self.datas[col_moyens].unique())

def cal_sum_cat_by_month(self):
    "Retourne le montant total par catégorie pour chaque mois"
    dict_sum_cat_by_month = {}
    for date in self.months:
        dict_sum_cat_by_month[str(date)] = []
        for categorie in self.categories:
            mask_cat_by_month = ((self.datas[self.col_date] == pd.Period(date))
                                 &
                                 (self.datas[self.col_cat] == categorie))
            sum_cat_by_month = self.datas[mask_cat_by_month][self.montants].sum(
            )
            if sum_cat_by_month != 0:
                dict_sum_cat_by_month[str(date)].append(
                    (categorie, sum_cat_by_month))
    return (dict_sum_cat_by_month)

def cal_sum_moyen_by_month(self):
    "Retourne le montant total par moyen pour chaque mois"
    dict_sum_moyen_by_month = {}
    for date in self.months:
        dict_sum_moyen_by_month[str(date)] = []
        for moyen in self.moyens:
            mask_moyen_by_month = ((self.datas[self.col_date] == pd.Period(date))
                                   &
                                   (self.datas[self.col_moyens] == moyen))
            sum_moyen_by_month = self.datas[mask_moyen_by_month][self.montants].sum(
            )
            if sum_moyen_by_month != 0:
                dict_sum_moyen_by_month[str(date)].append(
                    (moyen, sum_moyen_by_month))
    return (dict_sum_moyen_by_month)

def cal_sum_by_month(self):
    "Retourne le montant total pour chaque mois"
    dict_sum_by_month = {}
    for month in self.months:
        mask_sum_by_month = self.datas[self.col_date] == month
        dict_sum_by_month[str(
            month)] = self.datas[mask_sum_by_month][self.montants].sum()
    return dict_sum_by_month

def cal_sum_cat_by_year(self):
    "Retourn le montant total sur l'année pour chaque catégorie"
    dict_sum_cat_by_year = {}
    for categorie in self.categories:
        mask_cat_by_year = self.datas[self.col_cat] == categorie
        dict_sum_cat_by_year[categorie] = self.datas[mask_cat_by_year][self.montants].sum(
        )
    return (dict_sum_cat_by_year)

def cal_sum_moyen_by_year(self):
    "Retourn le montant total sur l'année pour chaque moyen"
    dict_sum_moyen_by_year = {}
    for moyen in self.moyens:
        mask_moyen_by_year = self.datas[self.col_moyens] == moyen
        dict_sum_moyen_by_year[moyen] = self.datas[mask_moyen_by_year][self.montants].sum(
        )
    return dict_sum_moyen_by_year

def cal_sum_year(self):
    "Retourn le montant total sur l'année"
    return self.datas[self.montants].sum()
demandé 18-Mar par rosalia (152 points)
edité 18-Mar par max

2 Réponses

+3 votes
 
Meilleure réponse

Quand tu assignes une variables self.data = ..., tu ajoutes un attribut à la classe. Par conséquent, cet attribut devient visible pour tout le monde. C'est à faire si tu en as besoin à plusieurs endroits dans ta classe.
Par contre, si tu ne t'en sers que dans une méthode comme variable, évite de "polluer" et utilises-là comme variable normale. Ça permettra aussi au garbage collector de pouvoir faire le ménage à la fin de l'appel de la méthode.

Un peu plus d'info, en anglais : https://www.programiz.com/article/python-self-why

répondu 19-Mar par Tiger-222 (780 points)
sélectionné il y a 6 jours par rosalia
0 votes

Il ne faut pas forcément mettre des self à toutes tes variables. Comme tu dis, si c'est juste une variable intermédiaire qui est propre à la méthode, qui sert juste à faire un calcul, elle n'a aucun intérêt à être un attribut.

Tous les attributs (les variables self.x) vont plus tard être accessibles quand tu utiliseras ta classe.

Self est juste une convention, tu pourrais utiliser toto et ça marcherait pareil. Quand tu codes une méthode (une fonction dans une classe, en gros), cette fonction va automatiquement recevoir en premier argument l'objet courant, qu'on appelle par convention self.

répondu 24-Mar par anonyme
...