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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top