Получить объект класса __dict__ без специальных атрибутов
-
20-09-2019 - |
Вопрос
Для получения всех определенных атрибутов класса я пытаюсь использовать
TheClass.__dict__
но это также придает мне особые качества.Есть ли способ получить только самоопределяемые атрибуты или мне нужно самому «очистить» словарь?
Решение
Другое решение:
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())
Я не думаю, что это очень надежно, и, возможно, есть лучший способ.
Это действительно решает некоторые основные проблемы, на которые указывают некоторые другие ответы:
- Нет необходимости в
'name convention'
фильтрация на основе - Предоставление собственной реализации магических методов, например.
__len__
это не проблема (определите в A).
Другие советы
Вы не можете очистить __dict__
:
AttributeError: attribute '__dict__' of 'type' objects is not writable
Вы могли бы положиться на соглашения об именах:
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']
Это может быть ненадежно, поскольку вы, конечно, можете перезаписать или реализовать специальные/магические методы нравиться __item__
или __len__
в вашем классе.
Я не думаю, что есть что-то простое, да и почему?Между магическими и определяемыми пользователем атрибутами нет никакой языковой разницы.
Решение MYYN не будет работать, если у вас есть пользовательский атрибут, начинающийся с «__».Однако он предлагает решение, основанное на соглашениях:если вы хотите проанализировать свои собственные классы, вы можете определить свое собственное соглашение об именах и отфильтровать его.
Возможно, если вы объясните необходимость, мы сможем найти лучшее решение.