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']
6 Réponses :
Vous pouvez utiliser: où class_instance code> est une instance de votre classe. p> p>
Vous recherchez peut-être Cette réponse ici . Dans votre cas, ce serait:
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.
Vous pouvez le faire à l'aide d'une variable de liste code> global code> la sortie de ce sera p>
Pouvez-vous s'il vous plaît expliquer comment il va résoudre la question initiale?
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]
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']
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'}
Vous pourriez être en mesure de tirer parti de la méthode code> code>, 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] code>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 __ code>)?