Учитывая экземпляр некоторого класса в 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
определяет функцию, куда (class_, attribute), возвращающую кортеж, содержащий имя файла, класс и строку в исходном коде, который определил или разделил на подклассы attribute
. Это означает определение в теле класса, а не последнее присваивание из-за чрезмерного динамизма. Хорошо, если он возвращает «unknown» для некоторых атрибутов.
>>> 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 вы не всегда можете разумно знать, но было бы неплохо получить хорошие ответы в общем случае в основном статического кода.