首页 > 代码库 > 72.8接口和内省
72.8接口和内省
接口的概念与多态有关。在处理多态对象时,只要关心他的接口(或称“协议”)即可,也就是公开的方法和特性。在python中,不用显式地指定对象必须包含哪些方法才能作为参数接收。例如,不用(像java中一样)显式地编写接口,可以在使用对象的时候假定他可以实现你所有要求的行为。如果他不能实现的话,程序就会失败。
一般来说,只需要让对象符合之前的接口(换句话说就是实现当前的方法),但是还可以更灵活一些。除了调用方法然后期待一切顺利之外,还可以检查所需方法是否已经存在。如果不存在,就需要做一些其他事情:
>>>hasattrc(tc, ‘talk‘)
True
>>>hasattrc(tc, ‘fnord‘)
False
上面的代码中,对象tc(TalkingCalculator,本章前面例子中的类)有个叫做talk的特性(包含一个方法),但是并没有fnord特性。如果需要的话,甚至检查talk特性是否可调用:
>>>callable(getattr(tc, ‘talk‘, None))
Trur
>>>callable(getattr(tc, ‘fnord‘,None))
False
这段代码使用了getattr函数,而如果没有在if语句内使用hasattr函数直接访问特性,getattr函数允许提供默认值(本例中为None),以便在特性不存在时使用,然后返回的对象使用callable函数
如果要查看对象内所有存储的值,那么可以使用_dict_特性。如果真的想要找到对象是由什么组成的,可以查看inspect模块。这是为那些想要编写对象浏览器(以图形方式浏览python对象的程序)以及其他需要类似功能的程序的高级用户准备的。关于对象和模块的更多信息,可以参见10.2节。
7.3一些关于面向对象设计的思考
关于面向对象设计的书记已经很多,尽管这并不是这本书所关注的问题,但是还是给出一些要点。
1.将属于一类的对象放在一起。如果一个函数操纵一个全局变量,那么两者最好都在类内作为特性和方法出现。
2.不要让对象过于亲密。方法应该只关心自己实例的特性。让其他实例管理自己的状态。
3.要小心继承,尤其是多成继承。继承机制有时很有用,但也会在某些情况下让事情变得过于复杂。多继承难以正确使用,更难以调试。
4.简单就好。让你的方法小巧。一般来说,多说方法都应该在30秒内被读完(以及理解),尽量将代码行数控制在一定一页或一屏之内。
当考虑需要什么类以及类要有什么方法时,应该尝试下面的方法
(1)写下问题的描述(程序要做什么),把所有名词、动词和形容词加下划线。
(2)对于所有名词,用作可能的类
(3)对于所有的动词,用作可能的方法
(4)对于所有的形容词,用作可能的特性。
(5)把所有的方法和特性分配到类。
现在已经有了面向对象模型的草图了。还可以考虑类和对象之间的关系(比如继承和协作)以及他们的作用,可以用以下步骤精炼模型。
(1)写下(或者想象)一些列的使用模型,也就是程序应用时的场景,试着包括所有的功能。
(2)一步步考虑每个使用实例,保证模型包括所有需要的东西。如果有遗漏的话就添加进来。如果某处不太正确则改正。继续,直到满意为止。
当认为已经有了可以应用的模型时,那就可以开工了。可能需要修正自己的模型,或者是程序的一部分。幸好,在python中不用过多关心这方面的事情,因为很简单,只要投入进去进行了。
72.8接口和内省