接口测试学习-python第七课(面向对象编程)
以前都是面向过程编程,做一件事是按顺序来的,必须经过很多操作。现在是面向对象编程,将各种操作集合在一起,然后指挥其适用于多个场景。
上课时老师举了一个蛮贴切的例子,比如买车,面向过程就是先去学车,然后去4s店买车,然后去办证,然后保险,然后临时牌照,然后正式牌照。面向对象就像将这些所有步骤会经历的场景整合起来,直接开一个车辆
购置办证中心,然后从学车到办证甚至以后的缴纳罚款全都在这里处理。
在我的理解,面向对象就是给一些有共同性的事物先造一个模型,这个模型有这些事物共同的属性,也有这些事物共同的处理方法。然后一旦需要针对某个事物单独操作时,只要调用
这个模型,这个事物就可以根据已经配好的属性和方法很快的建造起来。
面向对象编程有几个基础的点,分别是类、构造函数、属性、方法、实例化。细化分还有类变量、实例变量、类方法、实例方法、析构函数、私有化、继承等等。
1、类
类是利用class定义的,如num1和num2,这两者的区别是类num2后面的括号里有“object”,前者被称为经典类,后者被称为新式类。没有很大的区别。
1 class num1(): 2 pass 3 4 class num2(object): 5 pass
2、属性
属性其实就是变量,包括类变量(直接在类中定义的变量)和实例变量(在“def __init__(self):”下定义的变量)。
比如一个班有很多个学生,都生活在成都,学生们的年级、班级和年龄假设都是一样的,那么这些就是学生的共同属性,可以用变量先定义。
1 class Students(): 2 county = 'China' # 类变量,公共变量,每个实例都能用,可以节省内存 3 def __init__(self): 4 self.class = '高三二班' # 实例变量 5 self.age = 18
3、方法
如果我们要打印这个班学生的姓名、班级和年龄。那么就得创造一个方法,也是一个函数。比如下面的print_info函数,就可以打印出每个对象的姓名、班级和年龄。
1 class Students(): 2 county = 'China' # 类变量,公共变量,每个实例都能用,可以节省内存 3 def __init__(self, name): 4 self.class = '高三二班' # 实例变量 5 self.age = 18 6 self.name = name 7 8 def print_info(self): 9 print('学生的姓名是%s' % self.name) 10 print('学生的班级是%s' % self.class) 11 print('学生的年龄是%s' % self.age)
4、实例化
每一个类都是必须实例化才能使用的,不能那种车辆模型开车上路对吧,还是要有一辆真正的车才行。实例化就相当于对比着自己喜欢的模型得到一个真实的物品,这个物品是根据模型对比购买的,所以它拥有和模型同样的颜色、模样等等。所以实例化的对象是拥有类里面的属性和方法的。
1 class Students(): 2 county = 'China' # 类变量,公共变量,每个实例都能用,可以节省内存 3 def __init__(self, name): 4 self.class = '高三二班' # 实例变量 5 self.age = 18 6 self.name = name 7 8 def print_info(self): 9 print('学生的姓名是%s' % self.name) 10 print('学生的班级是%s' % self.class) 11 print('学生的年龄是%s' % self.age) 12 13 zxm = Student(name = '张晓明') # 实例化 14 print(zxm.class) # 输出结果为18 15 zxm.print_info() # 会打印zxm这个对象的姓名、班级、年龄
5、构造函数和析构函数
构造函数就是类实例化时运行的函数,析构函数就是销毁实例化对象的函数。一般连接数据库后需要关闭数据库,这里可以将关闭数据库的代码放在析构函数中,这样执行完毕后自动销毁实例同时自动关闭链接。
1 class MyDb(object): 2 # 析构函数 3 def __del__(self): 4 self.cur.close() 5 self.coon.close() 6 print('over....') 7 # 构造函数 8 def __init__(self, 9 host,user,passwd,db, 10 port=3306,charset='utf8'): 11 try: 12 self.coon = pymysql.connect( 13 host=host,user=user,passwd=passwd, 14 port=port,db=db,charset=charset, 15 autocommit=True # 自动提交,在非select语句时可以不需要再commit了 16 ) 17 except Exception as e: 18 print('数据库链接失败!%s' % e) 19 else: 20 self.cur = self.coon.cursor(cursor=pymysql.cursors.DictCursor)
6、私有
变量分私有变量和公有变量,顾名思义,私有变量就是只能在类里面调用的不可修改的变量,而公有变量是在类外对象也可以调用修改的变量。私有变量的定义方法就是在变量名前面加两个下划线。
1 import redis 2 class My(object): 3 def __init__(self): 4 self.__host = '***.*.**.**' # 私有变量 5 self.__port = 6379 6 self.__password = '*******' 7 8 self.r = redis.Redis(host=self.host,port=self.port,password=self.password) 9 10 def get(self, k): 11 res = self.r.get(k) 12 if res: 13 return res.decode() 14 return None
1 my = My() #实例化 2 my.port = 9999 # port是私有变量无法修改 3 print(my.__host) # host是私有变量,无法在类外调用 4 my.__close() # close是私有方法,无法在类外调用
7、继承
定义新式类时括号中一般会写“object”,其实这就是定义的类继承了object类。所以写在括号中的类就是定义的类所要继承的类。被继承的类可以成为父类或者基类,新的类成为子类。子类可以继承父类的所有属性和方法,并可以定义自己的属性和方法且不会影响父类。
比如下面,定义了一个连接数据库的基础类,这个类有一些属性如host、port、password等等。而不论连接mysql数据库或者redis数据库都会用到这些属性。那么定义MySQL类和redis类时就可以直接继承Base类,这样host、port、password这些属性就可以直接使用了。
1 class Base(object): 2 def __init__(self, host, port, password): 3 self.host = host 4 self.port = port 5 self.password = password 6 7 8 class Mysql(Base): 9 pass 10 11 12 class Redis(Base): 13 pass