Ich versuche, von einer Klasse zu kopieren Klasse in eine andere AttributeSo kopieren Klassenattribute ohne Instanziierung
d = {1:'one', 2:'two'}
class X(object):
a = 1
b = 2
Ich brauche Klasse Y zu definieren, so dass die folgenden Bedingungen erfüllt ist: assert Y.a =='one' and Y.b=='two'
Ein Weg, um dies zu erreichen ist wie folgt:
attrDict = {attr:d[getattr(X,attr)] for attr in dir(X) if isinstance(getattr(X,attr), int)}
# attrDict is {'a':'one', 'b':'two'}
class Y(X):
def __init__(self):
self.copyOver()
@classmethod
def copyOver(klass):
[setattr(klass, k,v) for k,v in attrDict.iteritems()]
y = Y() # Y.a = 1 unless this runs
assert Y.a == 'one' and Y.b == 'two'
jedoch Instanziierung in einer realen Anwendung kann teuer sein: Wäre es möglich, aCH ieve das ohne?
Mit anderen Worten, was built-in verwende ich Klasse ohne Instanziierung eines Objekts davon erforderlich aktualisieren Attribute?
class Y(X):
#TODO: setattr all key value pairs in attrDict on the class Y, not on instances of it.
#TODO: Do it without requiring to instantiate an object of class Y
Bitte nicht missbrauchen Listenkomprehensionen für Nebenwirkungen = (Wie auch immer, können Sie einfach anrufen 'Y.copyOver()' direkt nach der Definition von 'Y' statt es in '__init__' Or. Dies ist sogar eine völlig separate Funktion, da es keine Klassenmethode sein muss: 'copy_over (Y, attrDict)' – Ryan
@Ryan, Sure - Listenverständnis, das nur dazu dient, eine Lösung zu demonstrieren, ich stimme mit 'Y.copyOver (Aber wie stelle ich sicher, dass jeder, der Y benutzt, Y.copyOver() ausführt? – Spade
Sie können dafür Metaklassen verwenden, da sie vererbt werden, aber was Sie wirklich damit erreichen wollen ? Was für ein Gesamtbild? – Ryan