Python:使用类输出错误

时间:2013-01-11 17:39:50

标签: python class

我正在尝试在python中创建一个非常简单的计算器。在使用函数之前我已经完成了一个工作,但是添加类证明是很难的。

def askuser():
    global Question, x, y

    Question = input("""Enter a word: ("Add", "Subtract", "Multiply", "Divise")""")
    x = int(input("Enter first number: "))
    y = int(input("Enter second number: "))

class calculating:

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def add(self):
        return self.x + self.y

    def subtract(self):
        return self.x - self.y

    def multiplication(self):
        return self.x * self.y

    def division(self):
        return self.x / self.y

math = calculating

def calc():

    if Question == "Add":
        t = math.add
        print(t)

    elif Question == "Subtract":
        t = math.subtract
        print(t)

    elif Question == "Multiply":
        t = math.multiplication
        print(t)

    elif Question == "Division":
        t = math.division
        print(t)

def final():
    input("Press any key to exit:" )


def main():

    askuser()
    calc()
    final()

main()

代码运行正常,但它给我一个“错误”而不是输出计算:

   Enter a word: ("Add", "Subtract", "Multiply", "Divise")Add

   Enter first number: 5

   Enter second number: 5

   function add at 0x02E4EC90

   Press any key to exit:

为什么会这样?任何帮助都会很棒,谢谢。

3 个答案:

答案 0 :(得分:2)

您正在打印函数本身,而不是调用它的结果。尝试:

def calc():

if Question == "Add":
    t = math.add

elif Question == "Subtract":
    t = math.subtract

elif Question == "Multiply":
    t = math.multiplication

elif Question == "Division":
    t = math.division

print t()

或更干净但更先进:

class UserInputCalculator(object):

    operations = ["Add", "Subtract", "Multiply", "Divide"]

    def __init__(self):
        self.x = None
        self.y = None
        self.operation = None

    def run(self):
        self.prompt_for_operation()
        self.prompt_for_x()
        self.prompt_for_y()
        if self.operation == 'Add':
            return self.add()
        elif self.operation == 'Subtract':
            return self.subtract()
        elif self.operation == 'Multiply':
            return self.multiply()
        elif self.operation = 'Divide':
            return self.divide()
        else:
            raise ValueError('Unknown operation %s.' % operation)

    def prompt_for_operation(self):
        self.operation = input("Enter an operation: (%s)" % ', '.join(UserInputCalculator.operations))
        if self.operation not in UserInputCalculator.operations:
            raise ValueError('%s not a valid operation.' % self.operation)
        return self.operation

    def prompt_for_x(self):
        try:
            self.x = int(input("Enter first number: "))
        except:
            raise ValueError('Invalid value.')
        return self.x

    def prompt_for_y(self):
        try:
            self.y = int(input("Enter second number: "))
        except:
            raise ValueError('Invalid value.')
        return self.y

    def add(self):
        return self.x + self.y

    def subtract(self):
        return self.x - self.y

    def multiply(self):
        return self.x * self.y

    def divide(self):
        return self.x / self.y

calculator = UserInputCalculator()
print calculator.run()
input("Press any key to exit:" )

答案 1 :(得分:1)

行:

t = math.multiplication

将函数对象math.multiplication分配给t,然后使用下一行打印。您需要添加()以使该函数实际执行:

t = math.multiplication()

答案 2 :(得分:0)

另外两个答案是正确的,说你在这里做的是打印函数本身,而不是调用它的结果。我认为你应该重新考虑这个程序的结构,并问问自己为什么你在这里使用类。一般而言,类应该是具有状态的东西,即与每个实例相关联的一个或多个变量。这需要实例化类;但是,您的代码不包含实例化(即使您定义了__init__函数);第math = calculating行只是将变量math变为对 calculating的引用( 的实例班级)。你使用全局变量而不是类变量,如果你以后想要将这个模块作为一个更大的程序的一部分导入(实际上,全局变量在大多数情况下通常不是一个好主意),这可能会有问题。 / p>

然后,我建议将函数视为采用特定变量集并返回其他一组变量的函数,而不是这种结构。这是考虑函数的唯一方法,但在这个简单的计算器示例中,它可能是最好的方法。

让我们从上到下看。您的main函数可能如下所示:

def main():
    (q,x,y) = askuser()
    ans = math[q](x,y)
    final(ans)

请注意,我在这里所做的是将每个函数的结果传递给下一个函数。另请注意,我现在使用math的语法不同;我将使用函数字典而不是一类函数。

让我们看一下如何实现main调用的函数。首先,askuser与您代码中的原始版本相同,但包含global声明的例外情况除外。

其次,math将是一个字典,定义如下:

def add(x,y):
    return x + y

def subtract(x,y):
    return x - y

def multiply(x,y):
    return x * y

def divide(x,y):
    return x / y

math = {"Add" : add,
        "Subtract" : subtract,
        "Multiply" : multiply,
        "Divide" : divide}

最后,final应该打印出答案:

def final(ans):
    print ans
    input("Press any key to exit:" )

这通常比您的解决方案更清洁。但是,如果你想学习如何很好地使用类,那对你来说并不是很重要。那么想想你想要什么样的状态,然后以这种方式实现你的代码。例如,您可以通过以下方式添加类calculator

class calculator:
    def compute(x,y):
        print "No operation defined!"

    def __init__(self,operation):
        if operation in math:
            self.compute = math[operation]
        else:
            print "%s is not a valid operation!"%operation

main将如下所示:

def main():
    (q,x,y) = askuser()
    mycalc = calculator(q)
    ans = mycalc(x,y)
    final(ans)