class AbstractDriver(object): def __init__(self, publisher=None): self.publisher = publisher def log(self, msg): print_with_time(msg) if isinstance(self.publisher, ZmqPublisher): self.publisher.publish(msg)@abstractmethoddef open(self): pass类体里面一般包括两个部分:属性和方法。其属性一般定义在__init__里面,方便在函数里调用。这里的__init__方法称作初始化方法,其目的是构造本类的新对象。在实例化一个对象时(ex:tcp_c = AbstractDriver())时,系统会自动对这个对象执行__init__方法。其中self.publisher = publisher,self.publisher表示该类的实例对象的属性,publisher表示传入的参数。私有变量:在类的定义中,以下划线_开头的属性名或者函数名都当作内部使用的名字,另外,以两个下划线__开头的名字不能在类定义之外用这个名字访问。静态方法:在函数定义的头部行之前加修饰符,静态方法的参数表中不应该有self参数,因此,调用静态方法的时候其参数表的形参都要接受外部传来的实参,这里是没有自动使用的self参数。本质上说,静态方法就是在类里面定义的普通函数,但也是该类的局部函数。
@staticmethoddef create_cmd(cmd): if "[11]" not in cmd: cmd = "[11]" + cmd if "\r\n" not in cmd: cmd = "{}\r\n".format(cmd) return cmd类方法:在其定义行前加修饰符@classmethod,定以的这种方法必须有一个cls参数,在类方法执行时,调用它的类将自动约束到方法的cls参数,通常用类方法实现与本类的所有对象有关的操作。
@classmethoddef create(cls, zmq_context, endpoint, polling_milliseconds=0): socket = zmq_context.socket(zmq.ROUTER) socket.bind(endpoint) return cls(socket, polling_milliseconds)python中提供了一个内置函数isinstance,专门用于检查类和对象的关系,例如isinstance(obj,cls)检查obj是否为cls类的实例,若是,返回True,否则返回false。继承、基类和派生类:在定义一个新的类时,可以列出一个或者几个已有的类作为被继承类,这样就建立了新定义类与指定已有类之间的继承关系,通过继承定义出来的新类就被称为已有类的派生类(或称子类),被继承类就称为派生类的基类(即父类)。Python 中表达式issubclass (cls1,cls2)可用来检查cls1和cls2是否有继承关系,是就返回True,否则返回false。标准函数super(),用在派生类的方法定义里,它要求从这个类的直接基类开始做属性检索,而不是从这个类本身开始插找。python异常处理,程序运行中发生的每个异常都有特定的名字,如valueerror、TypeError、ZeroDivisionError等,通常可以用try...except机制去处理异常
类定义实例:人事管理系统中的类问题分析与设计以一个公司的人事管理系统为例,将公司人员按职能分为两类:工程类(研发,测试,维护等)以及非工程类(人事,行政,财务等等);分析这两类人员都需要记录有用的信息,这两类人员都有共通性,也有各自的特殊情况:首先:作为公司职员,都应该具有:姓名,年龄,性别,工号,职位等公共信息。作为工程类人员,应该有所属工程部,项目记录,项目起始时间等。作为非工程人员,应该有考勤,培训,报销等信息。
方案设计首先是基本员工信息ADT设计,即给定职员(Staff),如下属性:姓名(name),性别(sex),年龄(age),工号(number),职位(position),同时所有员工还具有入职与离职的动作,由次可以给定如下抽象数据类型定义:
然后是工程人员ADT设计,属性是项目绩效(project_bonus),做的项目(project_number),同时有开发软件(develop)的动作,如下所示
最后是非工程人员ADT设计,属性基本ADT已经包含了,故只需要考虑其动作,主要有记录考勤(record_attendance),记录会议(record_meeting),财务核算(financial_accounting)等,如下所示
代码调试以及DEBUG:本实例主要以理解抽象概念,明白什么是ADT,以及ADT的实例化,理解什么是继承以及派生类。
总结抽象数据类型的基本思想是抽象定义与数据表示和数据操作的实现分离。定义抽象数据类型实质就是通过一组操作实现对象与外部的接口调用。python的类机制中,被继承的类被称为基类,继承的类称为派生类,如果在新类的定义时不指明基类,python会自动认为其基类是object。在类定义的层次结构中,最高层的类是object,其他类都是object的派生类。