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

Возможно, если вы объясните необходимость, мы сможем найти лучшее решение.

Другие вопросы по тегам