Python 在这种情况下,抽象是什么意思?

Python 在这种情况下,抽象是什么意思?,python,abstract,Python,Abstract,我需要一些帮助来理解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,

我需要一些帮助来理解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
是什么意思,因此无法理解问题所在。

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

有关更多信息,请参阅


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

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

抽象方法是类不实现的方法,使其成为抽象类;子类必须覆盖所有抽象方法(即,提供具体的实现),使其成为具体的类,即,可以为其创建实例的类。Python中表达“此方法是抽象的”的通常方式是将方法体设置为
raisenotimplementederror

有关一般概念的更多信息,以及Python中的细节,请参见


因此,在形式上,您需要将其子类化,并实现标记为“抽象”的这两个方法。(根据助教的提示,他或她可能实际上意味着你应该用一个工作的代码体替换“抽象”一词,但这与OOP中“抽象”的正常含义相比是一个相当大的延伸!-)。

这是一个描述的技巧。Python中没有关键字
abstract
,因此,如果不在某个子类中重写此方法,将导致
NotImplementedError

谢谢你的快速回答!为什么有人会使用抽象类?我在试图理解它存在的原因。。。。。。在OP的示例代码中,
abstract
只是人们查看它的一个标记,这里缺少了一些东西(真正的实现)。还有,可以有抽象函数吗?为什么要使用抽象类:想象一个Shape类。一些可能的方法可能是GetArea、getPermission等。但是,除非您知道要处理的是哪种形状,否则实现这些方法是不可能的。因此,它们在基本形状类中是抽象的,并在子类(矩形、三角形等)中实现。查看OOP上的wikipedia条目。在Python2.6中,模块集合中有许多抽象基类(ABC),例如
集合。MutableSet
——ABC定义了许多特定的集合操作,但您必须自己为集合的内部存储子类化并实现原语。
实际上,NameError
。我想这个把戏可能是我这一周看到的最糟糕的主意。是的,这是一个糟糕的做法。实际上,您应该在需要重写的方法中引发
NotImplementedError
错误。这让我成为一只悲伤的(编程)熊猫。另外,不要混淆堆栈溢出会突出显示
抽象
,就好像它是一个关键字一样。这样使用的系统必须适应多种编程语言,在许多情况下,抽象是一个关键词。但不是用Python。