2012-10-20 46 views
0

我有下面的類:如何讓子類調用__init__方法

import cfg 
import sqlite3 
import logging 

# logger = logging ...... 

class Connection: 
    def __init__(self): 
     try: 
      self.connection = sqlite3.connect(cfg.pathToDatabase) 
      self.connection.row_factory = sqlite3.Row 
      self.cursor = self.connection.cursor() 
      logger.info("Connection to database at " + cfg.pathToDatabase + " successful") 
     except Exception, e: 
      logger.critical("Error connecting to database") 
      logger.exception(e) 

該類將從多個類實例化。在下面一行:

logger.info("Connection to database at " + cfg.pathToDatabase + " successful") 

我想日誌的類稱爲連接類__ __的init方法。這可能嗎 ?

例如,基於以下幾點:

class Child: 
    def __init__(self): 
     self.connection = Connection() 

我希望看到這個記錄:

"Connection to database at data.sqlite successful from class: Child" 
+0

什麼是「這種方式」?你沒有展示任何方法或方法來使用你的課堂。 – defuz

+0

好的,我不認爲我需要第一個問題 - 我已經明白了這一點。我已經編輯了我的問題。 – Sherlock

+1

爲什麼你認爲只會有'Connection'類被實例化的類。可以從任何地方實例化它。一般來說,一個班級知道是誰打電話是不好的做法,並根據這些信息做一些事情。 – Vikas

回答

1

像這樣的事情?

import traceback, sys 

class C: 
    def __init__(self): 
     try: 
      raise StopIteration 
     except StopIteration: 
      tb = sys.exc_info()[2] 
      stack = traceback.extract_stack(tb.tb_frame) 
      f = stack[-2] 
      print "I was called from %s %s (%s:%s)" % (f[2], f[3], f[0], f[1]) 

class A: 
    def __init__(self): 
     self.c = C() 

def foo(): 
    A() 
    return C() 

def main(): 
    C() 
    foo() 

if __name__ == '__main__': 
    main() 

輸出:「它是不好的做法,用一個類來表示以這種方式與數據庫的連接」

I was called from main C() (test.py:22) 
I was called from __init__ self.c = C() (test.py:15) 
I was called from foo return C() (test.py:19) 
+0

這是完美的,非常感謝:) – Sherlock

+0

你真的需要一個假的例外嗎?我曾認爲Python有一種直接訪問堆棧的方法。 – millimoose

+0

像這樣:http://docs.python.org/library/traceback.html#traceback.extract_stack – millimoose