8.1.4 面向对象的方法应用——简易计算器

8.1.4 面向对象的方法应用——简易计算器

【案例8-1】 简易计算器。

计算器可以用面向过程和面向对象两种不同的方式实现。将计算器的设计从面向过程转换为面向对象实现,以便读者深入地理解面向对象编程中方法的定义与应用。

用面向过程的方法来实现简易计算器,可以将各种计算封装成一个函数,一个函数一种计算。实现代码如下:

在这段代码中存在这样的问题:

①首先,result是个全局变量,在很多地方都可以对其进行修改,一旦在程序编写过程中不小心修改了它的值,会直接导致结果出错;

②其次,代码特别散乱,各函数都是独立的个体,没有相关性。

改进思想:把这些零散的东西封装起来,放在一个整体的内部,这样就可以将各运算变成一个工具箱来使用。采用面向对象的思想来实现,首先针对全局变量,可以将它封装成类属性,其次针对函数的不相关性,在运算方法中,不需要对实例对象进行操作,只需要操作类属性,那么参数传递也只需要传递类,故而可以将计算函数封装成类方法。实现代码如下:

这段代码解决了面向过程的缺陷,但又存在新问题:一个类属性在内存空间中只有一个内存地址,就使得无法进行多个表达式的运算。因为同时进行多个运算时,都在修改同一个内存地址的值,就会造成结果混乱。

改进思想:将类属性result改成实例属性,将各运算方法改成实例方法,将初始化值改成构造方法,输出结果变成实例方法。调用时,先创建对象,让对象调用对应的实例方法,则可实现多表达式的运算。实现代码如下:

如果想添加一个容错功能,当传入的参数不是数值时,给出报错,则添加一个实例方法来实现容错功能。实现代码如下:

添加容错功能后产生了新的问题:添加容错处理后,破坏了方法的单一职责功能。

改进:使用装饰器(decorate),将容错功能封装在装饰器中,通过装饰器装饰相应方法,使函数具有某种功能。

装饰器的作用就是为已经存在的函数或对象添加额外的功能。装饰器本质上是一个Python的高阶函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能。它接收一个函数作为参数,然后,返回一个新函数。使用装饰器要用Python提供的@语法,这样可以避免手动编写f=decorate(f)这样的代码。

使用装饰器有两大优势:一是使代码的可读性更高;二是代码结构更加清晰,代码冗余度更低。

在使用装饰器时,需要注意以下几点:

①先定义函数,再修饰它,反之编译器会不认识它;

②修饰符“@”后面必须是之前定义的某一个函数;

③每个函数都可以有多个修饰符。

不带参数装饰器的基本格式:

注意:inner()函数中的参数必须与被装饰的函数function()的参数完全一致。

带参数装饰器的基本格式:

用装饰器给计算器添加一个数字判断的功能,代码如下: