来自同一个类的类继承

时间:2013-02-06 17:54:00

标签: python class inheritance magic-methods

我是python 2.7的新手,并且已经在这里寻找了几个小时的答案所以我想我会在溢出时问我的第一个问题。我希望有一天能够向社区添加一些东西,而不是一直潜伏着>。<

我正在创建一个项目管理工具,您可以在项目下定义一个必要的基本任务,并可能继承其他子任务基本任务。我在考虑最大的灵活性,最好在项目类下创建一个通用的任务类。当用户想要创建子任务时,它继承自基本任务。我想为基本任务分配一个小时的值,如果没有子任务是用户定义的,如果有子任务是由所有子任务定义的小时数之和定义。

到目前为止,这就是我所拥有的......:

class Task(self, superOBJ):
    #Define Tasks That Conform To SOW Here
    def __init__(self,cls,title):
        self.title=title
        self.description=""
        self.hours=None
    def Hours(self):
        if #NO SUBTASKS
            return self.hours
        else:
            return #SUM OF SUBTASKHOURS

    def SetHours(self,super,hours):
        self.hours=hours

这就是我遇到的问题我有一些想法,但没有深入了解它们

所以我的问题是处理继承的“好”方法是什么?有没有一种神奇的方法可以帮到这里?

2 个答案:

答案 0 :(得分:2)

您似乎建议每个子任务都应该是从Task派生的新类的实例。如果是这样,我建议避免这种方法。您尝试创建的内容可以通过Task实例树轻松建模,其中每个任务对象都包含子任务(子任务)的列表(可能为空)。然后,您可以通过递归迭代子任务列表来计算任务所需的时间,以在特定任务下的叶节点中累积时间(即else方法中的Hours子句)。

在某些时候,您可能有充分的理由来定义从Task派生的新类任务,但这应该只是在他们有某种特殊行为时,例如,他们的时间是如何计算的

答案 1 :(得分:0)

为了约定,我打算为你的“基础任务Task以及基类调用该类任务 BaseTask

class BaseTask(object):
    '''change object to BaseProject whenever you figure out what your `Project`
    class should be, or if you need it at all'''

    def __init__(self, title):
        self.title = title
        self.description=""

class Task(BaseTask):
    def __init__(self, title):
        super(Task, self).__init__(title)
        self.subtasks = []
        self.default_hours = 1

    @property
    def hours(self):
        if len(self.subtasks) < 1:
            return self.default_hours
        return sum(subtask.hours for subtask in self.subtasks)

class SubTask(BaseTask):
    def __init__(self, title):
        super(SubTask, self).__init__(title)
        self.hours = 0

这基本上应该是什么样子。您可以根据自己的喜好进行任何改变。通常,您应该了解继承组合之间的区别。此处,TaskSubTask都来自BaseTask,但Task组成的许多SubTask