Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys, inspect, logging
class MyLogger(logging.Logger):
"""Deute Klassenhierarchie durch ``A.B.C.method`` an.
"""
def __init__(self, name=""):
logging.Logger.__init__(self, name)
def debug(self, msg, *args, **kwargs):
method = inspect.stack()[1][3]
frm = inspect.stack()[1][0]
if 'self' in frm.f_locals:
clst = frm.f_locals['self'].__class__.mro()[:-1]
clst.reverse()
method = "%s.%s" % (".".join(x.__name__ for x in clst), method)
if not method.startswith('<'):
method += '()'
msg = ''.join((method, str(frm.f_lineno), msg))
self.__class__.__bases__[0].debug(self, msg, *args, **kwargs)
logging.setLoggerClass(MyLogger)
logging.basicConfig(
level=logging.DEBUG,
format="%(module)-18s:%(lineno)4d [%(funcName)-17s] %(message)s",
stream=sys.stdout,
)
Logger = logging.getLogger()
class A(object):
def __init__(self, a="<<A>>", *args, **kwargs):
if Logger.level == logging.DEBUG:
Logger.debug("Test A")
self.attr_a = a
def __unicode__(self):
return u"<A: A.attr_a=%s>" % (self.attr_a,)
class B(A):
def __init__(self, a="<<A>>", b="<<B>>", *args, **kwargs):
if Logger.level == logging.DEBUG:
Logger.debug("Test B")
A.__init__(self, a, *args, **kwargs)
self.attr_b = b
def __unicode__(self):
return u"<B: B.attr_a=%s, B.attr_b=%s>" % (self.attr_a, self.attr_b)
if __name__ == "__main__":
a = A()
b = B()
Was läuft hier falsch?