python 获取仅类属性不包括父类

10 投票
3 回答
3444 浏览
提问于 2025-04-17 00:40

那么,有没有办法只获取最具体类的属性字典或列表呢?到目前为止,我使用的是

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

撰写回答