Як було написано перед використанням, 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
.