这是我的第一个问题所以我希望我不会立刻抛出太多东西......我正在为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类型的布尔属性?
我希望这不会太久。非常感谢任何想法和想法
答案 0 :(得分:0)
您必须返回expand
的结果:
def expand(self):
return super(NodeStar,self).expand()
如果expand
类的NodeStar
方法与Node
类的方法完全相同,则无需在NodeStar
中重新定义方法class(这是面向对象编程的继承部分)。但是,如果NodeStar
expand
方法可以执行一些其他功能以及原始expand
方法的功能,那么您可以重新定义它并根据需要调用super.expand
需要(这是面向对象编程的多态性部分)
关于你的其他问题:
Object-Oriented programming提供了一些基本概念,如:
因此,这些原则在许多情况下肯定会有所帮助。您尝试使用代码实现的OO模式是所谓的Composite pattern的变体,请查阅更多信息和示例
有效地,composite design pattern
是一种以统一的方式处理单个项目和项目组合的方法。这是你(尝试)对Node
类(单项)和NodeStar
类(复合项,Node
项的序列)进行的操作