gpt4 book ai didi

Python 内省(introspection)与对象继承

转载 作者:行者123 更新时间:2023-12-01 03:46:36 27 4
gpt4 key购买 nike

我正在使用旧版本的 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)Child对象的实例并区分哪些方法来自Child类,哪些方法继承自Parent类?

最佳答案

不,dir() 没有给出这种区别。

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

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__')]

可以轻松地扩展该函数以跳过子类中已经出现的名称:

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)

此时它生成的条目数与 dir(Child) 完全相同,除了名称出现的顺序(上面按类对它们进行分组):

>>> sorted(name for c, name in dir_with_context(Child)) == dir(Child)
True

关于Python 内省(introspection)与对象继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38876335/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com