Python条件替换多态

我最近阅读了一篇文章/代码片段,其中显示了使用多态替换条件的示例.这是代码:

之前:

def log_msg(log_type):
    msg = 'Operation successful'
    if  log_type == 'file':
        log_file.write(msg)
    elif log_type == 'database':
        cursor.execute('INSERT INTO log_table (MSG) VALUES ('?')', msg)

后:

class FileLogger(object):
    def log(self, msg):
        log_file.write(msg)

class DbLogger(object):
    def log(self, msg):
        cursor.execute('INSERT INTO log_table (MSG) VALUES ('?')', msg)

def log_msg(obj):
    msg = 'Operation successful'
    obj.log(msg)

Here是我得到它的地方.

现在我的问题是,第二种方法比第一种方法更好吗?据我所知,如果我想使用第二种方法,每次我想记录某些内容时,我都必须做这样的事情:

if log_type == 'file':
    log_msg(FileLogger())
elif: log_type == 'database':
    log_msg(DbLogger())

我错过了这个或非常明显的观点吗?

解决方法:

关键是你通常只在程序的某个早期点创建了一个记录器对象.那么你只需要执行log_msg(myLogger),它会自动做正确的事情,无论你最初是否决定使用基于文件或基于数据库的日志记录.

换句话说,您的代码看起来像这样

# beginning of file
from logmodule import FileLogger, DBLogger, log_msg
myLogger = FileLogger()

# lots of other code here. . .
# later if you want to log something:

log_msg(myLogger)

稍后,您可以返回并将开头更改为myLogger = DBLogger(),一切仍然有效.我们的想法是在progrma的开头创建记录器,一旦你创建了它,你就不必担心你创建了哪种,你也可以使用它.

请注意,此示例(包括您最初发布的代码)只是一个骨架;它不是你可以直接使用的代码.首先,此代码不提供任何指定日志文件名的方法.我在这里描述的只是你为什么要重构这样的代码的想法.

上一篇:在Javascript中反序列化多态JSON


下一篇:获取作为基类传递的派生C#类的属性到泛型方法