我在实际关注源代码时遇到了麻烦,主要是因为简单地使用grep就没有了。
有没有办法找出某个方法继承自哪个类?例如,如果有类A
,其中包含方法foo()
和bar()
,则类B
具有biz()
和类{{1它继承了C
和A
中的所有属性和方法,我怎样才能确定哪个类B
来自哪个(没有严格查看手动来源)?
答案 0 :(得分:0)
您可以通过查看该类的 __bases__
属性来访问类的超类。给定三个简单类A
,B
,C
(Py2.7
必须 从{{1}继承}):
object
然后,您可以遍历class A:
def foo():
pass
def bar():
pass
class B:
def biz(): pass
class C(A, B):
pass
的 __bases__
,并检查其中一个类中是否存在属性C
(例如) 。
要执行此操作,您可以在 __dict__
中检查foo
的成员资格,其中包含foo
中每个类对象的名称:
__bases__
打印哪些:
for base in C.__bases__:
if 'foo' in base.__dict__:
print("Attribute: '{}' defined in {}".format("foo", base))
有关更完整和一般的观点:
Attribute: 'foo' defined in <class '__main__.A'>
返回:
# get all attributes of class C
vars = [classVar for classVar in dir(C) if not classVar.startswith('__')]
# iterate through all bases:
for base in C.__bases__:
for attr in vars:
if attr in base.__dict__:
print("Attribute: '{}' defined in {}".format(attr, base))
对于继承链中的所有类,您可以将Attribute: 'bar' defined in <class '__main__.A'>
Attribute: 'foo' defined in <class '__main__.A'>
Attribute: 'biz' defined in <class '__main__.B'>
切换为__mro__
,表示方法解析顺序;尝试解析属性引用时,对象python搜索元组。
如果我们向类__bases__
添加一个函数,并创建另一个继承自C
的类D
:
C
要查看每个函数的定义位置,只需在循环中使用class C(A, B):
def another(): pass
class D(C): pass
切换__bases__
:
__mro__
现在,这遵循# hold D's attributes (functions names, variables.)
attrs = [var for var in dir(D) if not var.startswith('__')]
# vars contents: ['another', 'bar', 'biz', 'foo']
for base in D.__mro__:
for attr in attrs:
if attr in base.__dict__:
print("Attribute: '{}' defined in {}".format(attr, base))
元组(在此特定情况下等于mro
)并产生类似的输出:
(__main__.D, __main__.C, __main__.A, __main__.B, object)
答案 1 :(得分:0)
您可以检查方法解析顺序确定的父类,并检查每个父类的成员:
for i in C.__mro__:
if 'bar' in i.__dict__:
print 'bar is in class ' + i.__name__
因此,给定以下类定义:
class A(object):
def foo(self): pass
def bar(self): pass
class B(object):
def biz(self): pass
class C(A,B): pass
运行上面的代码将给出
bar is in class A