【问题标题】:What does abstract mean in this context?在这种情况下,抽象是什么意思?
【发布时间】:2009-11-22 17:36:53
【问题描述】:

我需要一些帮助来理解 Python 概念。

class TilePuzzleProblem(search.Problem):
""" This class is the class for the NxN - blanks tile puzzle problem """

    def __init__(self, N, blanks, initial, goal):
        """ Initialize """
        search.Problem.__init__(self, initial, goal)
        self.N = N
        self.blanks = blanks

    def successor(self, state):
        """ Generate the successors of the given state. Returns a list of (move, successor) pairs"""
        abstract

    def h(self, node):
        abstract

目前代码挂在函数h(...)abstract部分,但我不知道abstract是什么意思,因此无法理解问题所在。

【问题讨论】:

    标签: python abstract


    【解决方案1】:

    这是here 描述的一个技巧。 Python中没有关键字abstract,所以,如果你不在某个子类中重写这个方法,就会导致NotImplementedError

    【讨论】:

    • NameError,实际上。我认为这个技巧可能是我整个星期见过的最糟糕的主意。
    • 是的,糟糕的做法。您实际上应该在需要覆盖的方法中自己提高NotImplementedError
    • 这让我变成了一只悲伤的(编程)熊猫。
    • 另外,不要混淆 Stack Overflow 会像关键字一样突出显示 abstract。 SO 使用的系统必须适应多种编程语言,并且在许多abstract 关键字。但不是在 Python 中。
    【解决方案2】:

    抽象方法是一个类没有实现的方法,使它成为一个抽象类;子类必须覆盖所有抽象方法(即提供具体实现)成为具体类,即您可以为其创建实例的类。 Python 中表达“这个方法是抽象的”的正常方式是让方法的主体为raise NotImplementedError

    有关一般概念的更多信息,除了 Python 中的细节,请参阅wikipedia

    因此,正式地,您需要继承它并实现这两个标记为“抽象”的方法。 (根据您的 TA 的提示,他或她实际上可能意味着您应该将“抽象”一词替换为可工作的代码体,但相对于 OOP 中“抽象”的正常含义而言,这将是一个相当大的延伸!-) .

    【讨论】:

      【解决方案3】:

      抽象函数是没有实现的函数。它是一个占位符,只是用来填写类契约,以便您知道子类应该提供哪些方法。您需要在此处创建TilePuzzleProblem 的后代并填写您自己的h 实现。如果您想按原样运行它,请创建一个后代并让您的 h 什么都不做。

      【讨论】:

        【解决方案4】:

        抽象意味着类必须被继承。抽象或“基”类提供了可以通过继承扩展的基类型。您不能实例化抽象类,只能实例化继承它的类。

        更多信息请参见this Wikipedia article

        您想要使用抽象基类的一个原因是您想要对子类型进行分类或分组。例如,CarTruckPlane 都将继承自 Vehicle 抽象基类。您不能只实例化“车辆”,您必须实例化汽车、卡车或飞机。抽象可以保护它不被实例化。

        【讨论】:

        • 感谢您的快速回答!为什么有人会使用抽象类?我试图了解它存在的原因......
        • ... 在 OP 的示例代码中,abstract 只是人们查看它的标记,这里缺少一些东西(真正的实现)。
        • 还有,可以有抽象函数吗?
        • 为什么要使用抽象类:想象一个 Shape 类。一些可能的方法是 GetArea、GetPerimeter 等。然而,除非你知道你正在处理什么样的形状,否则实现这些是不可能的。因此,它们在基本 Shape 类中是抽象的,并在子类(矩形、三角形等)中实现。查看关于 OOP 的维基百科条目。
        • 在 Python2.6 中,模块集合中有很多抽象基类 (ABC),例如 collections.MutableSet -- ABC 定义了许多特定的集合操作,但您必须继承并实现自己设置的内部存储。
        猜你喜欢
        • 2020-04-04
        • 2017-03-28
        • 2016-08-26
        • 2014-10-27
        • 2019-10-15
        • 2020-11-03
        • 1970-01-01
        • 2014-03-27
        • 2016-10-05
        相关资源
        最近更新 更多