Créer dynamiquement des attributs de classe
J'ai besoin de créer dynamiquement des attributs de classe à partir d'un dictionnaire par DÉFAUT.
defaults = {
'default_value1':True,
'default_value2':True,
'default_value3':True,
}
class Settings(object):
default_value1 = some_complex_init_function(defaults[default_value1], ...)
default_value2 = some_complex_init_function(defaults[default_value2], ...)
default_value3 = some_complex_init_function(defaults[default_value3], ...)
J'ai également pu obtenir ce par le fait d'avoir qqch. comme __init__
pour la création de classes, afin de créer dynamiquement ces attributs à partir du dictionnaire et d'économiser beaucoup de code et stupide de travail.
Comment le feriez-vous?
Je vous remercie beaucoup à l'avance!
OriginalL'auteur xyz-123 | 2010-04-06
Vous devez vous connecter pour publier un commentaire.
Vous pourriez le faire sans metaclasses à l'aide de décorateurs. Cette manière est un peu plus claire de l'OMI:
Avant la version 2.6 de Python classe décorateurs étaient pas disponibles. Vous pouvez donc écrire:
dans les anciennes versions de python.
Dans l'exemple fourni
apply_defaults
est réutilisable... Bien, sauf que les valeurs par défaut sont codés en dur dans le décorateur du corps 🙂 Si vous avez juste un seul cas, vous pouvez même simplifier votre code:C'est possible étant donné que les classes (dans le sens de types) sont des objets eux-mêmes en Python.
cls
dans le premier exemple) à la fin de la fonction décorateur, n'est-ce pas? M'a fallu un certain temps à comprendre, mais si je fais cela, la classe sera égal àNone
après la définition. Ai-je raté quelque chose, comme par exemple un moyen de fournir de la classe en référence à la place?Une manière élégante.
Comment puis-je passer les paramètres par défaut pour le fichier comme ceci
a = Settings(defaults)
settings.py
est un fichier particulierOriginalL'auteur nkrkv
Je pense que c'est le cas pour la métaclasse:
même question avec @vijayshanker
Le code dépend de la
defaults
dictionnaire être portée lors de la définition deSettings
classe.SettingsMeta
etSettings
dans le setting.py fichier? Comment puis-je passer les paramètres par défaut de paramètre?Avec le code actuel, vous ne pouvez pas passer n'importe quoi, le
defaults
dictionnaire est pris de l'ampleur, définis avantSettings
classe. Pour être en mesure de passer les paramètres par défaut, vous auriez besoin de le restructurer. Mais il se sent comme une question à l'un d'eux a demandé à l'origine.OriginalL'auteur Łukasz
Lors de la définition d'une classe, l'espace de noms local sera transformé en l'espace de noms de la classe à la fin du corps de la classe. En tant que tel, vous pouvez accomplir cela avec:
locals()
dit le contenu du dictionnaire retournés ne doivent pas être modifiés.Ce qui est intelligent. Merci.
OriginalL'auteur Brian