给定 Python 中某个类的实例,能够确定哪一行源代码定义了每个方法和属性(例如实现1)将很有用。例如,给定一个模块 ab.py
class A(object):
z = 1
q = 2
def y(self): pass
def x(self): pass
class B(A):
q = 4
def x(self): pass
def w(self): pass
定义一个函数 where(class_, attribute) 返回一个元组,该元组包含定义或子类化的源代码中的文件名、类和行attribute
。这意味着在班级主体中的定义,而不是由于过度活跃而导致的最新分配。如果它为某些属性返回“未知”,那很好。
>>> a = A()
>>> b = B()
>>> b.spigot = 'brass'
>>> whither(a, 'z')
("ab.py", <class 'a.A'>, [line] 2)
>>> whither(b, 'q')
("ab.py", <class 'a.B'>, 8)
>>> whither(b, 'x')
("ab.py", <class 'a.B'>, 9)
>>> whither(b, 'spigot')
("Attribute 'spigot' is a data attribute")
我想在自省 Plone 时使用它,其中每个对象都有数百个方法,按类而不是按字母顺序对它们进行排序非常有用。
当然,在 Python 中你不能总是合理地知道,但在大多数静态代码的常见情况下获得好的答案会很好。