class AbstractLogger:

    def debug(self, msg):
        self.log('DEBUG', msg)

def info(self, msg):
    self.log('INFO', msg)

def error(self, msg):
    self.log('ERROR', msg)

def log(self, level, msg):
    raise NotImplementedError()


class FileLogger(AbstractLogger):

    def __init__(self, file):
        self.file = file

def log(self, level, msg):
    self.file.write('{}: {}'.format(level, msg))


class DatabaseLogger(AbstractLogger):

    def __init__(self, cursor):
        self.cursor = cursor

def log(self, level, msg):
    self.cursor.execute(
        "INSERT INTO log_table (Level, Msg) VALUES ('{}', '{}')".format(
        level, msg))
Python conditionals replacement with polymorphism