获取类对象的 __dict__,不包含特殊属性

1 投票
3 回答
2821 浏览
提问于 2025-04-15 17:08

我想获取所有定义的类属性,所以我试着用这个方法:

TheClass.__dict__

但是这个方法也会返回一些特殊的属性。有没有办法只获取我自己定义的属性,还是说我需要自己“清理”这个字典呢?

3 个回答

2

我觉得没有什么简单的东西,为什么会有呢?在编程语言中,魔法属性和用户自定义属性之间并没有强制的区别。

MYYN的解决方案在你有一个以'__'开头的自定义属性时是行不通的。不过,它确实提供了一种基于约定的解决办法:如果你想查看自己定义的类,可以自己制定一个命名规则,然后根据这个规则来筛选。

也许如果你能解释一下你的需求,我们可以找到更好的解决办法。

3

你不能清理 __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__

5

还有一种解决方案:

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())

我觉得这个方法不是特别可靠,可能还有更好的办法。

不过这个方法确实解决了一些其他答案提到的基本问题:

  • 不需要根据 '命名约定' 来过滤
  • 自己实现一些特殊方法,比如 __len__ 是没问题的(在 A 中定义)。

撰写回答