Domanda

Per ottenere tutti gli attributi della classe definiti cerco di andare con

TheClass.__dict__

ma che mi dà anche gli attributi speciali. C'è un modo per ottenere solo gli attributi autodefiniti o devo a "pulire" il me stesso dict?

È stato utile?

Soluzione

Un'altra soluzione:

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())

Non credo che questo è terribilmente robusto e ci potrebbe essere ancora un modo migliore.

Questo indirizzo fa alcune delle questioni fondamentali alcune delle altre risposte indicò:

  • Non c'è bisogno di 'name convention' base-filtraggio
  • Fornire la propria implementazione di metodi di magia, per esempio __len__ non è un problema (definire in A).

Altri suggerimenti

Non è possibile pulire la __dict__:

AttributeError: attribute '__dict__' of 'type' objects is not writable

Si poteva contare su convenzioni di denominazione :

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']

Questo può non essere affidabile, dato che è possibile, naturalmente, sovrascrivere o implementare speciale / magic metodi come __item__ o __len__ nella tua classe.

Non credo che ci sia qualcosa di semplice, e perché ci sarebbe? Non c'è alcuna differenza di lingua-forzata tra magia e attributi definiti dall'utente.

La soluzione di MYYN non funziona se si dispone di un attributo definito dall'utente che iniziano con '__'. Tuttavia, lo fa suggerire una soluzione basata su convenzioni:. Se si desidera introspezione le proprie classi, è possibile definire la propria convenzione di denominazione, e filtrare su quel

Forse, se si spiega la necessità siamo in grado di trovare una soluzione migliore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top