python 获取仅类属性不包括父类
那么,有没有办法只获取最具体类的属性字典或列表呢?到目前为止,我使用的是
for attr, value in obj.__class__.__dict__.iteritems():
但是这样做会把父类中定义的属性也包含进来。有办法避免这样吗?
3 个回答
2
它没有显示出父类的属性:
>>> class A(object):
def a(self):
print a
b = 3
>>> a = A()
>>> dir(a)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b']
>>> list(a.__class__.__dict__)
['a', '__module__', 'b', '__dict__', '__weakref__', '__doc__']
__module__
、__dict__
、__weakref__
、__doc__
这些看起来是每个类默认创建的属性。
对于旧式类,这些默认属性的列表是不同的:
>>> class B:
pass
>>> list(B().__class__.__dict__)
['__module__', '__doc__']
4
如果你想获取一个字典,里面包含所有类的属性及其对应的值,包括从父类继承来的属性,那么你可以使用下面的代码:
cls_dict = { attr: getattr(obj.__class__, attr)
for attr in dir(obj.__class__) }
for attr, val in cls_dict.iteritems():
logging.info("%s = %s", attr, val)
7
摘自Python文档
一个类有一个命名空间,这个命名空间是通过一个字典对象来实现的。类的属性引用会被转换成在这个字典中的查找,比如说,C.x会被转换成C.__dict__["x"](不过对于新式类来说,还有其他一些方法可以找到属性)。当在这个字典里找不到属性名时,系统会继续在父类中查找。
换句话说,__dict__里只包含类的“本地”属性,而父类的属性则存储在父类的__dict__里。
所以,你可以使用__class__.__dict__.iteritems()
来获取仅属于这个类的属性。
在Python 3中,你应该使用__class__.__dict__.items()
。