Получить объект класса __dict__ без специальных атрибутов
Для получения всех определенных атрибутов класса я пытаюсь пойти с
TheClass.__dict__
но это также дает мне особые качества. Есть ли способ получить только самоопределенные атрибуты или мне нужно "очистить" диктат сам?
3 ответа
Другое решение:
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 не будет работать, если у вас есть определенный пользователем атрибут, начинающийся с '__'. Тем не менее, он предлагает решение, основанное на соглашениях: если вы хотите проанализировать свои собственные классы, вы можете определить собственное соглашение по именованию и отфильтровать его.
Возможно, если вы объясните необходимость, мы сможем найти лучшее решение.