Come scritto prima dell'uso, è obj.__dict__
possibile gestire casi comuni ma alcune classi non hanno l' __dict__
attributo e l'uso __slots__
(principalmente per l'efficienza della memoria).
esempio per un modo più resiliente di fare questo:
class A(object):
__slots__ = ('x', 'y', )
def __init__(self, x, y):
self.x = x
self.y = y
class B(object):
def __init__(self, x, y):
self.x = x
self.y = y
def get_object_attrs(obj):
try:
return obj.__dict__
except AttributeError:
return {attr: getattr(obj, attr) for attr in obj.__slots__}
a = A(1,2)
b = B(1,2)
assert not hasattr(a, '__dict__')
print(get_object_attrs(a))
print(get_object_attrs(b))
l'output di questo codice:
{'x': 1, 'y': 2}
{'x': 1, 'y': 2}
Nota 1:
Python è un linguaggio dinamico ed è sempre meglio conoscere le classi da cui provi a ottenere gli attributi poiché anche questo codice può perdere alcuni casi.
Nota2:
questo codice genera solo variabili di istanza che indicano che le variabili di classe non sono fornite. per esempio:
class A(object):
url = 'http://stackoverflow.com'
def __init__(self, path):
self.path = path
print(A('/questions').__dict__)
uscite di codice:
{'path': '/questions'}
Questo codice non stampa l' url
attributo di classe e potrebbe omettere gli attributi di classe desiderati.
A volte potremmo pensare che un attributo sia un membro di istanza ma non lo è e non verrà mostrato usando questo esempio.
NewClass
. Puoi sfidare le aspettative della gente se usi una convenzione di denominazione similenew_class
.