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中不用过多关心这方面的事情,因为很简单,只要投入进去进行了。

时间: 2024-11-06 15:08:12

72.8接口和内省的相关文章

C#语言开发规范

1.  命名规范 a) 类 [规则1-1]使用Pascal规则命名类名,即首字母要大写. eg: Class Test { ... } [规则1-2]使用能够反映类功能的名词或名词短语命名类. [规则1-3]不要使用"I"."C"."_"等特定含义前缀. [规则1-4]自定义异常类应以Exception结尾. eg: Class TestException { ... } [规则1-5]文件名要能反映类的内容,最好是和类同名. b) 类字段(类成

C#语言开发规范-ching版

学习C#之初,始终不知道怎么命名比较好,很多时候无从命名,终于有一天我整理了一份命名规范文档,自此我就是按照这个命名规范书写代码,整洁度无可言表,拙劣之处请大家斧正,愚某虚心接受,如有雷同,不胜荣幸 C#语言开发规范 作者ching 1.  命名规范 a) 类 [规则1-1]使用Pascal规则命名类名,即首字母要大写. eg: Class Test { ... } [规则1-2]使用能够反映类功能的名词或名词短语命名类. [规则1-3]不要使用“I”.“C”.“_”等特定含义前缀. [规则1-

<<Python基础教程>>学习笔记 | 第07章 | 更加抽象

------ Python:面向对象的编程语言,多态,封装,继承三个主要特性 多态:来自希腊语,意味着有多种形式. >>> from random import choice >>> x = choice(['Hello,World!',[1,2,'e','e',4]]) >>> x.count('e') 1 任何不知道对象到底是什么类型,但又要对对象做的什么的时候,就要用到多态 >>> 1+2 3 >>> 'hot

Python基础教程【读书笔记】 - 2016/7/4

希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第二波:第7章  更加抽象 [总览] 创建自己的对象,是Python的核心概念!Python被称为面向对象的语言.介绍如何创建对象,以及多态.封装.方法.特性.超类以及继承的概念. [7.1] 对象的魔力 面向对象程序设计中的术语对象(object)基本上可以看做数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合.对象最重要的优点包括以下几方面: 多态polymorphism:意味着可以对不同类的对象使

python之抽象二

多态:意味着可以对不同类的对象使用同样的操作 封装:对外部世界隐藏对象的工作细节 继承:以普通的类为基础建立专门的类对象 def getPrice(object): if isinstance(object,tuple): return object[1] else: return magic_network_method(object) 这里用isinstance进行类型/类检查是为了说明一点-----类型检查一般说来并不是什么好方法,能不用则不用. 前面的代码中使用isinstance函数查

Python学习记录七---继承、多态和封装

1.创建类 创建文件 test7.py #! /usr/bin/env python class Person: def setName(self, name): self.name = name def getName(self): return self.name def greet(self): print "hello, world! I am %s."% self.name foo = Person() foo.setName('yilia') foo.getName() f

Python快速学习第六天

第六天: 面向对象 1. 面向对象的特点--多态,封装,继承 对象:包括特性和方法,特性只是作为对象的一部分变量,而方法则是存储在对象内的函数. (1)多态--对不同类的对象,使用同样操作.不知道对象到底是什么类型,但又要对对象做一些操作 很多内置的函数和运算符都是多态的 不用关注x到底是什么类型,都可以使用count函数,另外还有repr(),连接符+等 Python代码   1.  >>> x = 'string'  #x是字符串 2.  >>> x.count('

《Python基础教程》(7)

更加抽象: 7.1对象的魔力:1.多态:可以对不同类的对象使用相同的操作. 2.封装:对外部世界隐藏对象的工作细节. 3.继承:以普通的类为基础建立专门的类对象 7.1.1多态:意味着就算不知道变量所引用的对象类型是什么,还是能对它进行操作,而它也会根据对象(或类)类型的不同表现出不同的行为.可以让用户对于不知道是什么类的对象进行方法调用. 7.1.2封装:对全局作用域中其他区域隐藏多余的信息.可以不用关心对象是如何创建的而直接进行使用. 7.1.3继承: 7.2类和类型: 7.2.1类到底是什

微信公众平台开发教程--方培工作室,PHP语言版本

准备工作 微信公众平台的注册 介绍如何注册一个微信公众账号. 入门教程 微信公众平台开发入门教程 内容:1.申请SAE作为服务器; 2.启用开发模式; 3.微信公众平台PHP SDK; 4.接收发送消息类型解析; 5.微信公众平台开发模式原理; 6.快速开发天气预报功能. 入门教程是下面所有教程的基础. 基础接口 微信公众平台开发(2) 天气预报 介绍了使用中国天气网气象数据,实现微信上的天气预报功能. 微信公众平台开发(3) 中英翻译 介绍了使用有道翻译的接口,在微信公众平台上,开发中英互译的