python 3,super()函数和类继承 - 它甚至可以这样做吗?

时间:2015-05-18 23:06:44

标签: class python-3.x inheritance super tree-search

这是我的第一个问题所以我希望我不会立刻抛出太多东西......我正在为Vacuum Cleaner World problem实现四种不同的算法。到目前为止,我制作了四个不同的工作.py文件,但我认为我会让它变得更加漂亮,因为很多代码都会被重复,并且在一个具有良好类层次结构的文件中实现它。所以起初我有一个Node类看起来有点像这样,每个算法都有点不同(广度优先,A *,贪婪和随机):

class Node(object):
def __init__(self, parent, depth, cost, plan):
    plana = copy.deepcopy(plan)
    self.parent = parent
    self.succsor = []
    self.depth = depth
    self.cost = cost
    self.position = []
    self.plansza = plana
# 'plansza' is an object which is a representation of state - e.g. board with marked uncleaned rooms
    self.action = ''
def printa(self):
    return [self.action]
def isFirst(self):
    res = (self.plansza.side/2)
    self.position = [res,res]
def clean(self):
    n = Node(self, self.depth+1, self.cost+1, self.plansza)
    n.position = self.position
    no = n.plansza.board
    no[n.position[0]][n.position[1]] = '.'  
    n.action = 'clean'  
    self.succsor.append(n)
def up(self):
    # // self.action = 'up'
    n = Node(self,self.depth+1,self.cost+1, self.plansza)
    n.position = [self.position[0]-1, self.position[1]]
    n.action = 'up'
    self.succsor.append(n)

#couple of other move methods...

def expand(self):
    pos = self.position 
    self.none()
    if (pos[0]>0):
        self.up()
    if (pos[1]>0):
        self.left()         
    if (pos[1] + 1 < self.plansza.side):
        self.right()
    if (pos[0] + 1 < self.plansza.side):
        self.down()
    if self.plansza.board[pos[0]][pos[1]] == 'x':
        self.clean()
    return self.succsor

现在我正在尝试使用super()函数来定义名为NodeStar的Node的子类(用于A *实现):

class NodeStar(Node):
def __init__(self, parent, depth, cost, plan):
    super(NodeStar,self).__init__(parent, depth, cost, plan)
    self.heur = self.funH()
    self.prior = self.cost + self.heur
def expand(self):
super(NodeStar,self).expand()

其中'self.heur','self.funH()'和'self.prior'是Node类没有的属性nad函数。 此代码不起作用。我收到了一个错误:

line 211, in treeSearch
for item in exp:
TypeError: 'NoneType' object is not iterable

(旁边的想法:)我不知道为什么我必须在super()函数中使用参数,即使我在我的计算机上安装了python 3.4.3(我使用Anaconda的Sublime Text 3工作)

我看到问题与TreeSearch函数有某种关系,其中在边缘的第一个节点上调用了expand()函数。

但我主要担心的是 - 这是一个好方向吗?如果是这样,我怎么假设使用super()函数?例如,如果我需要相同的方法但具有不同的回报,我可以找到super()有用吗?或者,在这种情况下,我应该覆盖整个事情吗? 或者也许我应该而不是覆盖方法(不节省大量代码)尝试在Node类中创建一些将改变Node类型的布尔属性?

我希望这不会太久。非常感谢任何想法和想法

1 个答案:

答案 0 :(得分:0)

您必须返回expand的结果:

def expand(self):
    return super(NodeStar,self).expand()

如果expand类的NodeStar方法与Node类的方法完全相同,则无需在NodeStar中重新定义方法class(这是面向对象编程的继承部分)。但是,如果NodeStar expand方法可以执行一些其他功能以及原始expand方法的功能,那么您可以重新定义它并根据需要调用super.expand需要(这是面向对象编程的多态性部分)

关于你的其他问题:

Object-Oriented programming提供了一些基本概念,如:

  1. 继承/扩展(DRY,dont-repeat-yourself)
  2. 多态性(类似的界面,用于多方面的功能)
  3. 封装(只有接口可见,而底层实现可以根据需要改变)
  4. 因此,这些原则在许多情况下肯定会有所帮助。您尝试使用代码实现的OO模式是所谓的Composite pattern的变体,请查阅更多信息和示例

    有效地,composite design pattern是一种以统一的方式处理单个项目和项目组合的方法。这是你(尝试)对Node类(单项)和NodeStar类(复合项,Node项的序列)进行的操作