Festlegen ein Klassenattribut mit einem bestimmten Namen in Python, während die Klasse definiert,

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

  •  22-09-2019
  •  | 
  •  

Frage

Ich versuche, so etwas zu tun:

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

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

Aber ich kann nicht scheinen, um die Referenz auf die Klasse zu finden, die setattr zu bekommen, das gleiche zu arbeiten, wie nur eine Variable in der Klassendefinition zuweisen. Wie kann ich das tun?

War es hilfreich?

Lösung

Sie erhalten eine Metaklasse für diese verwenden müssen:

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

Andere Tipps

Sie können es sogar noch einfacher:

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

Im Gegensatz zu der vorherige Antwort, diese Lösung spielt auch mit externem metaclasses (zB., Django-Modelle).

sein Dies kann, weil die Klasse A nicht vollständig initialisiert ist, wenn Sie Ihre setattr(A, p, v) tun es.

Das erste, was wäre, zu versuchen, nur die settattr nach unten zu verschieben, nachdem Sie den class Block schließen und sehen, ob das funktioniert, z.

class A(object):
    pass

setattr(A, property, value)

Ansonsten das Ding Ignacio sagte nur über metaclasses .

Also ich weiß, das ist wirklich alt ist und wahrscheinlich ein totes Pferd zu schlagen, und dies kann nicht möglich gewesen, zu der Zeit, aber ich Cam über das versucht, mein eigenes Problem zu lösen.

Ich erkennen dies ohne metaclassing erreicht werden kann.

Die setattr nimmt und Objekt, Accessor Namen und Wert. Nun ist das Objekt nicht der Name der Klasse, es ist die spezifische Instanz der Klasse, die mit sich selbst erreicht werden kann.

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

a = A()
print a.a
print a.key
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top