使用不同的呼号处理多重继承

2024-10-02 00:36:43 发布

您现在位置:Python中文网/ 问答频道 /正文

所以这是一个python设计问题+多重遗传。我正在做我的一个程序,我遇到了一个问题,我想不出一个像样的方法来解决。你知道吗

保持简单。软件扫描另一个程序生成的日志事件文件。最初,它创建每个事件并将其存储在一个代表性的事件对象中。但是我想用一种更健壮的语言快速地访问它们,所以在对每个事件进行一点处理之后,我将它们加载到一个sqldb中,这样就比以前有了更多的数据。当我查询DB时,我想为每个代表事件的条目重新创建一个对象,这样更容易处理。你知道吗

我遇到的问题是,我希望避免大量重复的代码,从技术上讲,我应该能够为每个事件重用原始类中的一些代码。示例:

 class AbstractEvent:
    __init__(user, time)
    getTime()
    getUser()
 class MessageEvent(AbstractEvent):
    __init__(user,time,msg)
    getMessage()
 class VideoEvent(AbstractEvent):
    pass

但是,数据进入数据库后会有额外的数据,因此需要有新的子类:

 class AbstractEventDB(AbstractEvent):
    __init__(user, time, time_epoch)
    getTimeEpoch()
    (static/classmethod) fromRowResult(row)
 class MessageEventDB(AbstractEventDB, MessageEvent):
    __init__(user, time, msg, time_epoch, tags)
    getTags()
    (static/classmethod) fromRowResult(row)
 class VideoEventDB(AbstractEventDB, VideoEvent):
    pass

这是一个比正在发生的事情更简单的版本,但是它显示了一些正在发生的事情。我将日志文件中的长格式时间戳更改为epoch时间戳,当它们进入DB时,会在消息事件上添加各种标记,但是其他事件除了时间戳更改之外没有任何额外的内容。你知道吗

上面是我想要格式化它的理想方式,但是我遇到的问题是,DB对象端的调用签名与简单事件端完全不同;因此,当我尝试调用super()时,我得到了一个关于缺少预期参数的错误。你知道吗

我希望有人能提供一些关于如何构造它的建议,避免代码重复10-20次,特别是在fromRowResult(工厂方法)中。非常感谢你的帮助。你知道吗


Tags: 数据对象代码程序dbtimeinit时间
1条回答
网友
1楼 · 发布于 2024-10-02 00:36:43

我认为您需要的是一个用于decorator设计模式的Python实现。 http://en.wikipedia.org/wiki/Decorator_pattern

其主要思想是用继承+组合取代多重继承:

class  AbstractEvent(object):
    def __init__(self, user, time):
        self.user = user
        self.time = time


class MessageEvent(AbstractEvent):
    def __init__(self, user, time, msg):
        super(MessageEvent, self).__init__(user, time)
        self.msg = msg


class AbstractEventDBDecorator(object):
    def __init__(self, event, time_epoch):
        # event is a member of the class. Using dynamic typing, the event member will
        # be a AbstractEvent or a MessageEvent at runtime. 
        self.event = event
        self.time_epoch = time_epoch

    @classmethod
    def fromRowResult(cls, row):
        abstract_event = AbstractEvent(row.user, row.time)
        abstract_event_db = AbstractEventDBDecorator(abstract_event, row.time_epoch)
        return abstract_event_db


class MessageEventDB(AbstractEventDBDecorator):

    def __init__(self, message_event, time_epoch, tags):
        super(MessageEventDB, self).__init__(message_event, time_epoch)
        self.tags = tags

    @classmethod
    def fromRowResult(cls, row):
        message_event = MessageEvent(row.user, row.time, row.msg)
        message_event_db = MessageEventDB(message_event, row.time_epoch, row.tags)
        return message_event_db


class Row:
    def __init__(self, user, time, msg, time_epoch, tags):
        self.user = user
        self.time = time
        self.msg = msg
        self.time_epoch = time_epoch
        self.tags = tags


if __name__ == "__main__":
    me = MessageEvent("user", "time", "msg")
    r = Row("user", "time", "Message", "time_epoch", "tags")
    med = MessageEventDB.fromRowResult(r)
    print med.event.msg

相关问题 更多 >

    热门问题