获取类对象的 __dict__,不包含特殊属性
我想获取所有定义的类属性,所以我试着用这个方法:
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 中定义)。