Définition d'un attribut de classe avec un nom donné en python tout en définissant la classe

StackOverflow https://stackoverflow.com/questions/2519807

  •  22-09-2019
  •  | 
  •  

Question

Je suis en train de faire quelque chose comme ceci:

property = 'name'
value = Thing()
class A:
  setattr(A, property, value)
  other_thing = 'normal attribute'

  def __init__(self, etc)
    #etc..........

Mais je ne peux pas sembler trouver la référence à la classe pour obtenir le setattr de travailler la même chose que la simple assignation d'une variable dans la définition de la classe. Comment puis-je faire?

Était-ce utile?

La solution

Vous aurez besoin d'utiliser un métaclasse pour cela:

property = 'foo'
value = 'bar'

class MC(type):
  def __init__(cls, name, bases, dict):
    setattr(cls, property, value)
    super(MC, cls).__init__(name, bases, dict)

class C(object):
  __metaclass__ = MC

print C.foo

Autres conseils

Vous pouvez le faire encore plus simple:

class A():
    vars()['key'] = 'value'

Contrairement à la réponse précédente, cette solution joue bien avec les métaclasses externes (par ex., Les modèles Django).

Cela peut être parce que la A de classe n'est pas complètement initialisé quand vous faites votre setattr(A, p, v) là-bas.

La première chose à essayer serait de déplacer tout le settattr jusqu'à après la fermeture du bloc class et voir si cela fonctionne, par exemple.

class A(object):
    pass

setattr(A, property, value)

Dans le cas contraire, cette chose Ignacio juste dit métaclasses au sujet.

Je sais que c'est vraiment vieux et probablement battre un cheval mort et cela peut ne pas été possible à l'époque mais je came à travers cette essayer de résoudre mon problème.

J'ai réalisé cela peut être accompli sans metaclassing.

Le setattr prend et de l'objet, le nom accesseur, et la valeur. Eh bien l'objet n'est pas le nom de la classe, il est l'instance spécifique de la classe, ce qui peut être accompli avec soi.

class A(object):
    def __init__(self):
        self.a = 'i am a accessor'
        setattr(self, 'key', 'value')

a = A()
print a.a
print a.key
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top