Frage

eine Instanz einer Klasse in Python gegeben, wäre es sinnvoll sein, um die Zeile des Quellcodes bestimmen definiert alle Methoden und Eigenschaften (zB zur Umsetzung 1 ). Um zum Beispiel ein Modul ab.py

gegeben
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

definiert eine Funktion wohin (class_, Attribut) Zurückgeben einen Tupels enthält die Dateinamen, die Klasse und Zeile in dem Quellcode, der definiert oder subclassed attribute. Das bedeutet, die Definition in der Klasse Körper, nicht die letzte Zuordnung aufgrund overeager Dynamik. Es ist in Ordnung, wenn es für einige Attribute ‚unbekannt‘ zurückgibt.

>>> 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")

Ich möchte diese Zeit verwenden introspecting Plone, wo jedes Objekt Hunderte von Methoden hat und es wäre wirklich hilfreich sein, durch sie nach Klasse organisiert zu sortieren und nicht nur in alphabetischer Reihenfolge.

Natürlich in Python kann man nicht immer recht wissen, aber es wäre schön, gute Antworten in dem gemeinsamen Fall von meist statischem Code zu erhalten.

War es hilfreich?

Lösung 2

Sie suchen die undokumentierte Funktion inspect.classify_class_attrs(cls). Übergeben Sie es eine Klasse, und es wird eine Liste von Tupeln ('name', 'kind' e.g. 'method' or 'data', defining class, property) zurückzukehren. Wenn Sie auf absolut alles in einer bestimmten Instanz Informationen benötigen Sie zusätzliche Arbeit zu tun haben.

Beispiel:

>>> import inspect
>>> import pprint
>>> import calendar
>>> 
>>> hc = calendar.HTMLCalendar()
>>> hc.__class__.pathos = None
>>> calendar.Calendar.phobos = None
>>> pprint.pprint(inspect.classify_class_attrs(hc.__class__))
[...
 ('__doc__',
  'data',
  <class 'calendar.HTMLCalendar'>,
  '\n    This calendar returns complete HTML pages.\n    '),
 ...
 ('__new__',
  'data',
  <type 'object'>,
  <built-in method __new__ of type object at 0x814fac0>),
 ...
 ('cssclasses',
  'data',
  <class 'calendar.HTMLCalendar'>,
  ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']),
 ('firstweekday',
  'property',
  <class 'calendar.Calendar'>,
  <property object at 0x98b8c34>),
 ('formatday',
  'method',
  <class 'calendar.HTMLCalendar'>,
  <function formatday at 0x98b7bc4>),
 ...
 ('pathos', 'data', <class 'calendar.HTMLCalendar'>, None),
 ('phobos', 'data', <class 'calendar.Calendar'>, None),
 ...
 ]

Andere Tipps

Dies ist mehr oder weniger unmöglich, ohne die statische Analyse, und selbst dann, es wird nicht immer funktionieren. Sie können die Linie, wo eine Funktion definiert wurde und in welcher Datei durch seinen Code Objekt untersuchen, sondern darüber hinaus, gibt es nicht viel Sie tun können. Das inspect Modul kann dabei helfen. Also:

import ab
a = ab.A()
meth = a.x
# So, now we have the method.
func = meth.im_func
# And the function from the method.
code = func.func_code
# And the code from the function!
print code.co_firstlineno, code.co_filename

# Or:
import inspect
print inspect.getsource(meth), inspect.getfile(meth)

Aber bedenken Sie:

def some_method(self):
    pass
ab.A.some_method = some_method
ab.A.some_class_attribute = None

Oder noch schlimmer:

some_cls = ab.A
some_string_var = 'another_instance_attribute'
setattr(some_cls, some_string_var, None)

Insbesondere im letzteren Fall, was wollen Sie oder erwarten zu bekommen?

Sie suchen den Modul prüfen, speziell inspect.getsourcefile() und inspect.getsourcelines(). Zum Beispiel

a.py:

class Hello(object):
    def say(self):
       print 1

>>> from a import Hello
>>> hi = Hello()
>>> inspect.getsourcefile(hi.say)
a.py
>>> inspect.getsourcelines(A, foo)
(['   def say(self):\n        print 1\n'], 2)

die dynamische Natur von Python gegeben, dies für kompliziertere Situationen tun kann einfach nicht möglich sein ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top