在python中使用参数调用类函数

时间:2018-10-30 18:34:36

标签: python class

假设我有一个简单的链表类:

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()

我将如何完成这样的事情?

我不确定如何正式形容这一点-通过参数调用替代类的方法来分配类属性?

2 个答案:

答案 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

但是,您应该重命名nextprevious的字段或方法。我建议将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)

从概念上讲,我认为在继续之前考虑使用LLfoo想要达到的目标更为重要。