Получить объект класса __dict__ без специальных атрибутов - PullRequest
0 голосов
/ 17 декабря 2009

Для получения всех определенных атрибутов класса я пытаюсь перейти с

TheClass.__dict__

но это также дает мне особые качества. Есть ли способ получить только определенные пользователем атрибуты или я должен сам "очистить" диктат?

Ответы [ 3 ]

4 голосов
/ 17 декабря 2009

Другое решение:

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).
3 голосов
/ 17 декабря 2009

Вы не можете очистить __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__ в вашем классе.

2 голосов
/ 17 декабря 2009

Я не думаю, что есть что-то простое, и с чего бы это? Нет никакой языковой разницы между магическими и пользовательскими атрибутами.

Решение MYYN не будет работать, если у вас есть определенный пользователем атрибут, начинающийся с '__'. Тем не менее, он предлагает решение, основанное на соглашениях: если вы хотите проанализировать свои собственные классы, вы можете определить собственное соглашение об именах и отфильтровать его.

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

...