Ottenere __dict__ oggetto classe senza attributi speciali
-
20-09-2019 - |
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?
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.