使用类中的关键字来调用特定方法

时间:2016-03-31 09:04:51

标签: python class methods keyword

假设Python类具有不同的方法,并且根据用户指定的内容,在主函数calculate()中执行不同的方法。

在下面的示例中,用户需要指定关键字参数'methodOne''methodTwo'。如果未指定或关键字不正确,则默认为'methodOne'

class someClass(object):
    def __init__(self,method=None):
        methodList = ['methodOne','methodTwo']
        if method in methodList:
            self.chosenMethod = method
        else:
            self.chosenMethod = self.methodOne

    def methodOne(self):
        return 1

    def methodTwo(self):
        return 2

    def calculate(self):
        return self.chosenMethod()

由于method是字符串而不是函数,因此上述情况显然不起作用。如何根据关键字参数self.methedOne()选择self.methedOne()method?原则上,以下工作:

def __init__(self,method=None):
    if method == 'methodOne':
        self.chosenMethod = self.methodOne
    elif method == 'methodTwo':
        self.chosenMethod = self.methodTwo
    else:
        self.chosenMethod = self.methodOne

但如果我有两种以上的方法,那就变得相当难看了。有没有办法像我原来的代码那样做?

2 个答案:

答案 0 :(得分:1)

您可以使用getattr获取类对象的实际方法。

class someClass(object):
    def __init__(self,method=None):
        # store it with the object so we can access it later in calculate method
        self.method = method

    def methodOne(self):
        return 1

    def methodTwo(self):
        return 2

    def calculate(self):
        # get the actual method from the string here
        # if no such method exists then use methodOne instead
        return getattr(self, self.method, self.methodOne)()


> someClass('methodOne').calculate()
# 1

> someClass('methodTwo').calculate()
# 2

答案 1 :(得分:1)

您可以将getattr()用于此目的:

class someClass(object):
    def __init__(self,method=None):
        methodList = ['methodOne','methodTwo']
        if method in methodList:
            self.chosenMethod = method
        else:
            self.chosenMethod = self.methodOne

    def methodOne(self):
        return 1

    def methodTwo(self):
        return 2

    def calculate(self):
        return getattr(self, self.chosenMethod)()

x = someClass(method='methodOne')
print x.calculate()
>>> 1