【问题标题】:python 3, super() function and class inheritance - can it even be done this way?python 3,super() 函数和类继承——甚至可以这样做吗?
【发布时间】:2015-07-30 14:30:49
【问题描述】:

这是我的第一个问题,所以我希望我不会一次抛出太多东西。我正在为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 类没有的属性和函数。 此代码不起作用。我收到一个错误:

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 的类型?

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

【问题讨论】:

  • 我不确定您是否看到了我的(更新的)答案,所以我添加了此评论,我认为它回答了您所有的问题和问题

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


【解决方案1】:

你必须返回expand的结果:

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

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

关于您的其他问题:

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

  1. 继承/扩展(DRY,不要重复自己)
  2. 多态性(多方面功能的类似接口)
  3. 封装(仅使界面可见,而底层实现可以根据需要进行更改)

因此,这些原则在许多情况下肯定会有所帮助。您尝试使用代码实现的 OO 模式是 Composite pattern 的变体,请查看它以获取更多信息和示例

实际上,composite design pattern 是一种以统一方式处理单个项目和项目组合的方法。这就是您(尝试)对 Node 类(单个项目)和 NodeStar 类(复合项目,Node 项目序列)所做的事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2010-12-24
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    相关资源
    最近更新 更多