Holen Klassenobjekt __dict__ ohne besondere Attribute
-
20-09-2019 - |
Frage
Für alle die definierte Klasse immer Attribut Ich versuche, mit zu gehen
TheClass.__dict__
, aber das gibt mir auch die besonderen Eigenschaften. Gibt es eine Möglichkeit nur die selbstdefinierte Attribute zu erhalten, oder muss ich auf „saubere“ dict mich haben?
Lösung
Eine andere Lösung:
class _BaseA(object):
_intern = object.__dict__.keys()
class A(_BaseA):
myattribute = 1
print filter(lambda x: x not in A._intern+['__module__'], A.__dict__.keys())
Ich glaube nicht, das schrecklich robust ist und es könnte immer noch ein besserer Weg geben.
Das tut Adresse einige der grundlegenden Fragen einige der anderen Antworten zeigten auf:
- Keine Notwendigkeit für
'name convention'
Basis-Filterung - Die Bereitstellung Ihre eigene Implementierung von magischen Methoden, z.B.
__len__
ist kein Problem (definieren in A).
Andere Tipps
Sie können nicht die __dict__
reinigen:
AttributeError: attribute '__dict__' of 'type' objects is not writable
könnten Sie verlassen sich auf Namenskonventionen :
class A(object):
def __init__(self, arg):
self.arg = arg
class_attribute = "01"
print [ a for a in A.__dict__.keys()
if not (a.startswith('__') and a.endswith('__')) ]
# => ['class_attribute']
Das kann nicht zuverlässig sein, da kann man natürlich überschreiben oder implementieren special / Magie Methoden wie __item__
oder __len__
in Ihrer Klasse.
Ich glaube nicht, dass es etwas einfach, und warum sollte es sein? Es gibt keine Sprache erzwungene Unterschied zwischen Magie und benutzerdefinierte Attribute.
MYYN-Lösung wird nicht funktionieren, wenn Sie ein benutzerdefiniertes Attribut beginnend mit ‚__‘. Es wird jedoch eine Lösung basierend auf Konventionen vorschlagen., Wenn Sie Ihre eigenen Klassen introspect, können Sie Ihre eigene Namenskonvention und Filter auf das definieren
Vielleicht, wenn Sie die Notwendigkeit erklären können wir eine bessere Lösung finden.