【问题标题】:Class Inheritance from same Class同一个类的类继承
【发布时间】:2013-02-06 17:54:00
【问题描述】:

我对 python 2.7 非常陌生,并且已经为此搜索了几个小时的答案,所以我想我会在溢出时问我的第一个问题。我希望有朝一日能为社区添加一些东西,而不是一直潜伏>.

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

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

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

这就是我卡住的地方,我有一些想法,但没有深入了解它们

所以我的问题是处理继承的“好”方法是什么?有什么神奇的方法可以帮上忙吗?

【问题讨论】:

  • 你到底想让Task继承什么?你想让它继承Project吗?
  • 这不是类继承的用途。我建议您阅读它的用途以及它的工作原理; Wikipedia has a general overview.你要作文。

标签: python class inheritance magic-methods


【解决方案1】:

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

在某些时候,您可能有充分的理由定义从Task 派生的新任务类别,但只有当它们具有某种与如何计算时间有关的特殊行为时才应如此。

【讨论】:

  • 感谢您的洞察!我可能混淆了一些编程术语,我对这一切都很陌生。但是你得到了我的基本想法,即我想要一个未指定数量和深度的任务。递归函数在这里很有意义!
  • @forivall 提供的Task 类将满足您的大部分需求。您可能希望将单个任务时间添加到其构造函数中。如果您将该时间默认为零,那么您始终可以返回其自己的时间加上其子时间的总和。要创建子任务,只需创建一个新的Task 对象并执行task1.subtasks.append(task2)(您也可以类似地将task3 附加到task2)。
  • 亲爱的,我明天试试!
【解决方案2】:

为了约定,我将为您的“基础任务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由许多 SubTasks 组成的

【讨论】:

  • Task 类看起来不错,但似乎不需要SubTask 类,因为您可以简单地将Task 添加到另一个Tasksubtask 列表中。事实上,使用SubTask 类是有限制的,因为您不能将SubTask 添加到另一个SubTask,而仅使用Task 类就可以有多个级别的子任务。
  • 所以?它遵循他的规范所描述的内容,如果你真的是一个静态类型的小人物,你可以确保子任务只包含 SubTask 的实例,使用你喜欢的任何方法。这只是一个骨架,可以根据 OP 的需要进行细化。
  • 我希望只指定一个类并且对子任务的数量有未指定的深度,因为子任务可能有自己的子任务。谢谢大家的意见!
  • 然后你就可以使用我提供的Task 类了,就可以了!只需将 'default_hours' 重命名为 'raw_hours' 或类似名称,然后将标题和描述直接移动到 Task.__init__ 即可! -- 编辑:没有看到 bogatron 对他的回答的评论。
  • 嘿,这太完美了!谢谢
猜你喜欢
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多