带有对象继承的Python内省
我正在使用python的旧版本2.6.5。我可以使用dir查看对象有哪些成员,但我想区分对象中的成员与从父类继承的成员带有对象继承的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
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