2012-04-16 4 views
1

Я наследую и от threading.Thread и bdb.Bdb. Для потока требуется функция запуска для функции запуска, и мне нужно использовать функцию Bdb.run. Как я могу ссылаться на функцию запуска Bdb, так как я не могу сделать это с self.run? Я попробовал супер, но я, видимо, не пользуюсь этим правом, я получаю TypeError: должен быть тип, а не classobj.Справочные унаследованные функции класса

import sys 
import os 
import multiprocessing 
import threading 
import bdb 

from bdb import Bdb 
from threading import Thread 

from el_tree_o import ElTreeO, _RUNNING, _PAUSED, _WAITING 
from pysignal import Signal 

class CommandExec(Thread, Bdb): 
    ''' 
    Command Exec is an implementation of the Bdb python class with is a base 
    debugger. This will give the user the ability to pause scripts when needed 
    and see script progress through line numbers. Useful for command and 
    control scripts. 
    ''' 

    def __init__(self, mainFile, skip=None): 
     Bdb.__init__(self,skip=skip) 
     Thread.__init__(self) 

     # need to define botframe to protect against an error 
     # generated in bdb.py when set_quit is called before 
     # self.botframe is defined 
     self.botframe = None 

     # self.even is used to pause execution 
     self.event = threading.Event() 

     # used so I know when to start debugging 
     self.mainFile = mainFile 
     self.start_debug = 0 

     # used to run a file 
     self.statement = "" 

    def run(self): 
     self.event.clear() 
     self.set_step() 
     super(bdb.Bdb,self).run(self.statement) 
+0

Вы уверены, что ваш 'CommandExec' - это поток * и * база данных? Может быть, возможно, что у нее есть * база данных? – SingleNegationElimination

+0

Чтобы использовать супер, вы должны изменить эту строку на 'super (CommandExec, self) .run (self.statement)'. В python 3: 'super(). Run (self.statement)'. Вы получаете суперкласс CommandExec, а не суперкласс Bdb. :) – Darthfett

ответ

4

Подобно тому, как вы вызвали __init__ метод BDB по линии 22, вы можете вызвать его запустить метод:

Bdb.run(self, self.statement) 

super только полезно, когда вы не знаете, какой родительский класс вам нужно ссылаться на следующий , и вы хотите, чтобы механизм наследования Python понял это для вас. Здесь вы точно знаете, какую функцию вы хотите назвать, Bdb.run, так что просто позвоните.

+0

Спасибо за ответ ... Я пробовал это и получил: TypeError: unbound метод run() должен быть вызван с экземпляром Bdb в качестве первого аргумента (вместо этого был получен экземпляр str) ... любые идеи – user1313404

+1

@ user1313404: Обратите внимание на аргументы Я использовал: Bdb.run (self, self.statement) –

+0

Bdb - это базовый отладчик, а не база данных berkeley ... все еще вопрос действителен. Я пропустил себя как аргумент ... так что я плохой, я добавил себя как первый аргумент, и он отлично работал ... спасибо за вашу помощь. – user1313404

Смежные вопросы