12
votes

Ajout d'attributs de classe en utilisant une boucle de python

J'essayais de générer une classe à partir d'un dictionnaire: xxx

ceci donne l'erreur que ATTR n'est défini pas pendant la boucle de la boucle. Je sais que je pourrais écrire: xxx

mais je suis sûr que je me souviens de voir du code semblable au premier exemple quelque part. Est-ce que quelqu'un sait s'il est possible d'écrire quelque chose de similaire à la première forme?


0 commentaires

6 Réponses :


4
votes

Je ne sais pas exactement, ce que vous faites. Je peux vous donner l'exemple d'ajouter des attributs de classe à une classe dans A pour boucle: xxx

N'oubliez pas que pour être exécuté après la définition de la classe entière. Vous obtenez une erreur, que Attr n'est pas défini, car vous souhaitez accéder à la classe avant vous le créez ( classe ... est une déclaration à Python, qui crée une classe objet). Vous devez ajouter des attributs après avoir créé une classe et Rembemeber, ce sera des attributs de classe, pas des attributs d'instance.


0 commentaires

3
votes
class Attr:
  def __init__(self):
    for key in objects_type:
      setattr(Attr, key, lambda cl: list())

2 commentaires

+1: bon. Pourquoi pas une classe "neuve" qui hérite de objet ?


C'est le mauvais endroit pour le faire. Non seulement il est inutile, mais les méthodes liées existantes seront différentes des méthodes liées à partir d'objets instanciés ultérieurement. Bien, plus différent de l'habitude.



10
votes

Bien que ce ne soit pas très élégant, vous pouvez utiliser locaux () : xxx


4 commentaires

Cela a dû être ce que je me souviens de voir. Merci


En fait, je pense que c'est plus agréable que d'utiliser Setattr - donc je ne dirais donc pas son inélégant du tout


Vous n'êtes pas censé changer les habitants () dical () dict: docs.python.org/library/ Fonctions.html # Locaux


J'ai oublié ça :-(. Que pensez-vous que le risque de casse est?



4
votes
newmeths = {
  'two': lambda self: 2,
}

class MC(type):
  def __init__(cls, name, bases, dict):
    for k, v in newmeths.iteritems():
      setattr(cls, k, v)
    super(MC, cls).__init__(name, bases, dict)

class C(object):
  __metaclass__ = MC
  pass

c=C()
print c.two()

0 commentaires

4
votes

Supposons que vous souhaitiez ajouter de manière dynamique des attributs de classe tels que ceux-ci xxx

vous pouvez le faire de plusieurs manières par exemple. Il suffit d'ajouter des attributs après que la classe a été créée car vous pouvez facilement accéder au nom de la classe à l'intérieur de la classe xxx

ou mieux simplement créer une classe sur la volée par exemple Xxx

ou si vous souhaitez utiliser la métaclass, par exemple xxx


1 commentaires

Je pense que la méthode est la meilleure solution, compte tenu de la question. Il exige que le programmeur restructurale le reste de la définition des attributs de la classe. D'autre part, il évite de creuser dans locals () , évite de définir une métaclasse personnalisée et évite de fumer avec la logique de toutes les métaclasses Autres utilisés. IMO, cela le rend agréable à une bibliothèque d'autres utilisera et contribuent à.



-1
votes

J'ai lutté avec cela pendant une longue période et ma solution éventuelle à l'aide d'un exemple (puisque je suis tellement nouveau pour coder): xxx

donc 'cuba i' serait donc "cubai" l'ouragan de classe. De mes recherches d'autres Devs, cela n'est fortement pas recommandé, pourquoi je ne suis pas encore sûr. Semblait travailler assez bien pour le défi à la main. De toute façon fait avec cela ce que vous voulez.


0 commentaires