带有对象继承的Python内省

带有对象继承的Python内省,python,inheritance,python-2.6,Python,Inheritance,Python 2.6,我正在使用python的旧版本2.6.5。我可以使用dir查看对象有哪些成员,但我想区分对象中的成员与从父类继承的成员 class Parent(object): def parent_method1(self): return 1 def parent_method2(self): return 2 class Child(Parent): def child_method1(self): return 1

我正在使用python的旧版本2.6.5。我可以使用dir查看对象有哪些成员,但我想区分对象中的成员与从父类继承的成员

class Parent(object):

    def parent_method1(self):  
        return 1

    def parent_method2(self):
        return 2

class Child(Parent):

    def child_method1(self):
        return 1
是否有一种方法可以检查(即dir)子对象的实例,并区分哪些方法来自子类,哪些方法继承自父类?

否,
dir()
没有给出这种区分

您必须手动遍历并自己生成列表:

def dir_with_context(cls):
    for c in cls.__mro__:
        for name in sorted(c.__dict__):
            yield (c, name)
这将产生:

>>> list(dir_with_context(Child))
[(<class '__main__.Child'>, '__doc__'), (<class '__main__.Child'>, '__module__'), (<class '__main__.Child'>, 'child_method1'), (<class '__main__.Parent'>, '__dict__'), (<class '__main__.Parent'>, '__doc__'), (<class '__main__.Parent'>, '__module__'), (<class '__main__.Parent'>, '__weakref__'), (<class '__main__.Parent'>, 'parent_method1'), (<class '__main__.Parent'>, 'parent_method2'), (<type 'object'>, '__class__'), (<type 'object'>, '__delattr__'), (<type 'object'>, '__doc__'), (<type 'object'>, '__format__'), (<type 'object'>, '__getattribute__'), (<type 'object'>, '__hash__'), (<type 'object'>, '__init__'), (<type 'object'>, '__new__'), (<type 'object'>, '__reduce__'), (<type 'object'>, '__reduce_ex__'), (<type 'object'>, '__repr__'), (<type 'object'>, '__setattr__'), (<type 'object'>, '__sizeof__'), (<type 'object'>, '__str__'), (<type 'object'>, '__subclasshook__')]
在这一点上,它产生的条目数与
dir(Child)
的条目数完全相同,除了名称出现的顺序(以上按类分组):


在这种情况下,Python的精确版本并不重要。
def dir_with_context(cls):
    seen = set()
    for c in cls.__mro__:
        for name in sorted(c.__dict__):
            if name not in seen:
                yield (c, name)
                seen.add(name)
>>> sorted(name for c, name in dir_with_context(Child)) == dir(Child)
True