假设我有一个简单的链表类:
class LL:
def __init__(self):
self.next = None
self.previous = None
def next(self):
return self.next
def previous(self):
return self.previous
在这种情况下,我想根据传递给另一个类的函数的内容来调用上一个或下一个,如下所示:
class foo:
def __init__(self):
self.node = LL()
def move(direction):
self.node = self.node.direction
S.t。拨打电话时,它将拨打self.node.next()
或self.node.previous()
。
在哪里move(“ next”)将调用self.node.next()
。
这行不通。
self.node = self.node.direction()
我将如何完成这样的事情?
我不确定如何正式形容这一点-通过参数调用替代类的方法来分配类属性?
答案 0 :(得分:0)
对于您而言,最好使用if
语句使之保持简单。
def move(direction):
if direction == 'next':
self.node = self.node.next()
elif direction == 'previous':
self.node = self.node.previous()
else:
#handle the invalid input however you think is best
但是,您应该重命名next
和previous
的字段或方法。我建议将next(self)
更改为getNext(self)
。或者,您可以将self.next
更改为self._next
,以指示该字段不打算直接访问。
答案 1 :(得分:0)
如@ user2357112所示,您的LL
类本身存在阴影问题。您可能需要将其修改为以下之一:
class LL:
def __init__(self):
self._next = None
self._previous = None
# assign a different name
def next(self):
... do something like move the node to next
... maybe change self._next on the way...
return self._next
# Or make use of property decorator
@property
def previous(self):
... do something like move the node to previous
return self._previous
@previous.setter
def previous(self, value):
... do something to change self._previous
尽管如此,我仍然不认为这是您要追求的目标,但是为了回答问题的实质,您可以在dict
类中使用foo()
像switch语句,如下所示:
class foo:
def __init__(self):
self.node = LL()
def move(direction):
_moves = {
'next': self.node.next,
'previous': self.node.previous,
'nowhere': self.node.nowhere
}
# if you're invoking a method
_moves.get(direction)()
# if you're just referencing an attribute
_moves.get(direction)
从概念上讲,我认为在继续之前考虑使用LL
和foo
想要达到的目标更为重要。