Как написано перед использованием, obj.__dict__
можно обрабатывать общие случаи, но некоторые классы не имеют __dict__
атрибута и использования __slots__
(в основном для эффективности памяти).
пример более гибкого способа сделать это:
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))
вывод этого кода:
{'x': 1, 'y': 2}
{'x': 1, 'y': 2}
Примечание 1:
Python - это динамический язык, и всегда лучше знать классы, от которых вы пытаетесь получить атрибуты, поскольку даже этот код может пропустить некоторые случаи.
Примечание 2:
этот код выводит только переменные экземпляра, то есть переменные класса не предоставляются. например:
class A(object):
url = 'http://stackoverflow.com'
def __init__(self, path):
self.path = path
print(A('/questions').__dict__)
кодовые выходы:
{'path': '/questions'}
Этот код не печатает url
атрибут класса и может пропустить требуемые атрибуты класса.
Иногда мы можем думать, что атрибут является членом экземпляра, но это не так и не будет показано в этом примере.
NewClass
. Вы можете бросить вызов ожиданиям людей, если будете использовать соглашение об именах, напримерnew_class
.