Получить объект класса __dict__ без специальных атрибутов

StackOverflow https://stackoverflow.com/questions/1923130

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top