0
votes

Existe-t-il un moyen de transformer les variables de classe précédemment déclarées dans une liste?

Si nous avons une classe avec des variables, existe-t-il un moyen de transformer ces variables dans une liste?

Par exemple: P>

class Son(_Dad):
    var1 = 'foo'
    var2 = 'bar'
    # code here to generate varList = ['foo', 'bar']


7 commentaires

Vous pourriez être en mesure de tirer parti de la méthode , qui affiche un certain nombre d'attributs de l'objet: docs.python.org/3/library/fonctions.html#vars


Je ne pense pas que Python vous donne un moyen de trouver toutes les variables dans une méthode et de les mettre dans une liste. Vous pouvez créer une liste et ajouter toutes les variables que vous utilisez par la méthode .append


@Jawad. Cela ne se produit pas dans une méthode


Je veux dire que vous pouvez toujours faire my_list = [var1, var2]


Pourquoi ne déclarez-vous pas simplement une liste / dictionnaire dans votre classe?


@Madphysicist Cette classe compte plusieurs centaines de variables codées dures utilisées comme variables de référence dans une base de code. Comme la base de code est développée, certaines variables sont supprimées et de nouveaux sont ajoutés. Une liste ne fonctionnerait pas car les variables devraient être référencées par une liste d'index [100], et si une variable antérieure est supprimée, la liste [100] a maintenant une nouvelle valeur qui entraînerait une défaillance dans un test. Je joue avec l'idée d'utiliser un dictionnaire. Mais cela (si possible) serait le meilleur des deux mondes pour ce dont j'ai besoin.


@ Hierarchy009. Pourquoi avez-vous besoin d'une liste alors? Cela semble un peu xy-ish. Pourquoi ne pas utiliser un dictionnaire (que vous pouvez sous-ensemble de la classe __ dict __ )?


6 Réponses :


0
votes

Vous pouvez utiliser: xxx

class_instance est une instance de votre classe.


0 commentaires

-1
votes

Vous recherchez peut-être Cette réponse ici . Dans votre cas, ce serait: xxx


4 commentaires

Cela rendra aussi les méthodes.


@Emmanuelban oui c'est vrai. La réponse liée (et bien sûr votre réponse) gère ce cas aussi.


Si le nom de la variable est __FOOO, il sera géré comme _SON__VAR1 et il n'imprimera pas correctement le nom de la variable dans ce cas.


C'est la norme Python, que les variables internes commencent et se terminent par __ dans mon exemple, il y a la nécessité d'un chèque à la fin de __ aswell. Quoi qu'il en soit, il s'agit d'une sorte de préférence personnelle si vous souhaitez traiter des variables qui ne commencent que par __ comme variables internes ou non.



-1
votes

Vous pouvez le faire à l'aide d'une variable de liste global xxx

la sortie de ce sera xxx


1 commentaires

Pouvez-vous s'il vous plaît expliquer comment il va résoudre la question initiale?



0
votes

Vous pouvez le faire dans la classe elle-même sans créer son objet. Ici, je profite de la méthode locale et Varse. Vérifiez ci-dessous:

class Abc:
    a = 5
    b = 3
    attr_list = locals().copy()
    all_vars = vars().copy()
    c = [all_vars[attr] for attr in attr_list if attr in all_vars and not callable(all_vars[attr]) and not attr.startswith("__")]

    def check_c(self):
        print self.c

k = Abc()
k.check_c() #prints [5,3]


0 commentaires

0
votes

Vous pouvez utiliser vars () code> pour le faire (testé dans Python 3.8.0). Il examinera tout ce qui est défini dans la classe jusqu'au point qu'il est utilisé.

varlist: ['foo', 'bar']


0 commentaires

0
votes

Avez-vous pensé à utiliser un Metaclass ? Vous pouvez saisir tous les nouveaux champs de classe sur sa création, puis les utiliser pour créer la liste ou le dictionnaire si nécessaire.

>>>class DadMeta(type):
...    def __new__(mcs, name, bases, dct):
...        values_dict = {}
...        values_list = []
...        for name, value in dct.items():
...            if not callable(value) and not name.startswith("__"):
...                values_dict[name] = value
...                values_list.append(value)
...        
...        cls = super().__new__(mcs, name, bases, dct)   
...        cls.values_list = getattr(cls, "values_list", []) + values_list
...        cls.values_dict = {**getattr(cls, "values_dict", {}), **values_dict}
...               
...        return cls
...                
>>>class Dad(metaclass=DadMeta):
...    var_1 = "foo"
...    var_2 = "bar"
...
>>>Dad.values_list
['foo', 'bar']
>>>Dad.values_dict
{'var_1': 'foo', 'var_2': 'bar'}
>>>class Son(Dad):
...    var_3 = "test"
...    var_4 = "meh"
...
>>>Son.values_list
['foo', 'bar', 'test', 'meh']
>>>Dad.values_list
['foo', 'bar']
>>>Son.values_dict
{'var_1': 'foo', 'var_2': 'bar', 'var_3': 'test', 'var_4': 'meh'}


0 commentaires