Python基础
1 异常处理
- try调用后能捕捉异常信息,使程序能处理异常,并继续往下执行代码。不处理异常,程序会报错并不往下执行。
1.1 except xxxError as e
-
缺点:需要覆盖到所有的异常
1 ## -------------------------------------------------------------------- 2 ## 异常处理--缺点:需要覆盖到所有的异常 3 ## -------------------------------------------------------------------- 4 money = 1000 5 num = input('please input a num:') #用户输入是不可预测的 6 try: 7 num = float(num) 8 res = money/num 9 except ValueError as e: #ValueError: could not convert string to float: 'abc' 10 print('1=====', e) 11 except ZeroDivisionError as e: #ZeroDivisionError: float division by zero 12 print('2=====', e) 13 else: #不出现异常,执行else代码 14 money -= num 15 print('num:%s'%num) 16 print('你的余额是%s'%money) 17 finally: #无论怎样都会执行 18 print('我是finally')
1 please input a num:0 2 2===== float division by zero 3 我是finally 4 5 6 please input a num:1 7 num:1.0 8 你的余额是999.0 9 我是finally
1.2 except Exception as e
- 优点:只需要写一个Exception覆盖所有异常
-
1 ## -------------------------------------------------------------------- 2 ## 异常处理--优点:只需要写一个Exception覆盖所有异常 3 ## -------------------------------------------------------------------- 4 money = 1000 5 num = input('please input a num:') #用户输入是不可预测的 6 try: 7 num = float(num) 8 res = money/num 9 except Exception as e: #适于于所有的异常 10 print('3=====', e) 11 finally: #无论怎样都会执行 12 print('我是finally')
1 please input a num:fbbrr 2 3===== could not convert string to float: 'fbbrr' 3 我是finally
raise Exception(error infomation)
主动抛出异常后,代码不会再继续往下执行了。与不写try的区别是,raise Exception的error infomation可以增加一些自定义的提示信息
2.面向对象编程
面向对象概念
类(Class):
-
- 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量:
-
- 类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 类变量存放在类中。
- 引用格式:类名.类变量名
- 例如,连接数据库类,不适合写在类变量里,因为这样的话,对象不实例化,也会去连接数据库
数据成员:
-
- 类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
方法重写:
-
- 如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
实例变量/成员变量:
-
- 定义在方法中的变量,只作 用于当前实例的类。
- 实例变量可以在函数外修改值。只会影响该实例。
- 实例变量存放在实例对象中。
- 引用格式:对象名.实例变量名
- 执行如object.param时,会先找到实例变量param,如果没有该实例变量,则在类变量param中查找。
- 成员变量值可以是另外一个对象。如taotao.gf=shangjie (taotao、shangjie都是对象) taotao.gf.cry() 相当于执行shangjie.cry()
继承:
-
- 即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
- 例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化:
-
- 创建一个类的实例,类的具体对象。
方法:
-
- 类中定义的函数。
- 方法存放在类中。对象调用方法时,找到类方法的内存地址并调用它。
对象:
-
- 通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
构造函数 :
self:
-
- 代表本类对象。
- 某函数中定义: self.client,是实例变量,可以在本类中的所有函数中引用。某函数中定义:client ,是局部变量,只能在该方法内使用。
1 class hei: 2 def __init__(self): 3 self.haha='haha' 4 def a(self): 5 haha ='aa' 6 print('a.1===',haha) 7 print('a.2===',self.haha) 8 self.haha = 'cc' 9 haha ='bb' 10 def b(self): 11 try: 12 print('b.1===',haha) 13 except Exception as e: 14 print('b.1===',e) 15 print('b.2===',self.haha) 16 hxf=hei() 17 hxf.a() 18 hxf.b()
1 a.1=== aa 2 a.2=== haha 3 b.1=== name 'haha' is not defined 4 b.2=== cc
1 #!/usr/bin/python 2 # -*- coding:utf-8 -*- 3 # Author:hwm 4 ## -------------------------------------------------------------------- 5 ## 建立Person类--有构造函数 6 ## -------------------------------------------------------------------- 7 class Person:#经典类,类名都以大写字母开头 8 country = '中国' 9 # 以上变量为类变量,不实例化也可以通过Person.country调用。 10 def __init__(self, name):#构造函数。如果有传参的话要写; 如果没有传参的话可不写 11 print('开始造人了~~~~')#属性存到实例化对象内存里 12 self.name = name 13 self.eyes = 2 #属性 14 self.ears = 2 15 self.mouth = 1 16 # 以上变量为实例变量/成员变量 17 def cry(self):#方法存到类的内存里。实例对象中没有保存cry,只在类保存,优点是节省内存 18 print('%s哇哇哇'%self.name) 19 print('self=====', self)#self:本类对象 20 21 taotao = Person('涛涛')#taotao是实例化对象。会自动执行构造函数。 22 print('ears=====', taotao.ears) 23 taotao.ears =3 #实例变量可以在函数外修改值。只会影响该实例。 24 print('eyes=====', taotao.eyes) 25 taotao.money = 100000 #在类外面增加属性money 26 27 shangjie = Person('商洁')#实例化对象。会自动执行构造函数。 28 shangjie.sex = '女' 29 30 taotao.gf = shangjie 31 print('money=====', taotao.money) 32 taotao.cry()#调用cry方法 33 print('taotao=====', taotao)#通过查找taotao对象的内存地址,将本对象传给self,所以self是指本类对象 34 print('taotao.gf.cry()=====', taotao.gf.cry()) 35 print('taotao.gf.sex=====', taotao.gf.sex)#对象taotao的属性值是对象shangjie,可以访问对象shangjie的属性 36 taotao.country = '日本' 37 print('taotao.country=====', taotao.country)#首先在成员变量中找 38 print('shangjie.country=====', shangjie.country)#找不到成员变量,去类变量中找 39 Person.country = '加拿大' 40 print('taotao.country=====', taotao.country)#首先在成员变量中找 41 print('shangjie.country=====', shangjie.country)#找不到成员变量,去类变量中找 42 43 shangjie.cry() 44 print('shangjie=====', shangjie)#通过查找taotao对象的内存地址,将本对象传给self,所以self是指本类对象 45 46 ## -------------------------------------------------------------------- 47 ## 建立House类--无构造函数 48 ## -------------------------------------------------------------------- 49 class House(object):#新式类 50 def save(self): 51 print('能住人') 52 a = House() 53 a.save()
1 开始造人了~~~~ 2 ears===== 2 3 eyes===== 2 4 开始造人了~~~~ 5 money===== 100000 6 涛涛哇哇哇 7 self===== <__main__.Person object at 0x0000000000B3AC18> 8 taotao===== <__main__.Person object at 0x0000000000B3AC18> 9 商洁哇哇哇 10 self===== <__main__.Person object at 0x0000000000B3ACC0> 11 taotao.gf.cry()===== None 12 taotao.gf.sex===== 女 13 taotao.country===== 日本 14 shangjie.country===== 中国 15 taotao.country===== 日本 16 shangjie.country===== 加拿大 17 商洁哇哇哇 18 self===== <__main__.Person object at 0x0000000000B3ACC0> 19 shangjie===== <__main__.Person object at 0x0000000000B3ACC0> 20 能住人
封装MyDb类
1 import redis 2 3 class MyRedis: 4 def __init__(self,host,password,port=6379,db=0): 5 self.r=redis.Redis(host=host,password=password,port=port,db=db) 6 def op_str(self,k,v=None,ex=-1): #永不过期ex=-1 7 if v: 8 self.r.set(k,v,ex) #set不需要返回值 9 else: #没有传v 10 res=self.r.get(k) 11 if res: 12 return res.decode() 13 def op_hash(self,name,k=None): 14 if k: 15 res=self.r.hget(name,k) 16 if res: 17 return res.decode() 18 else:#没有传v, 取key里面所有的值 19 res={} 20 for k,v in self.r.hgetall(name).items(): 21 res[k.decode()]=v.decode() 22 return res 23 # def my_type(self,k): 24 # return 25 26 27 r1=MyRedis('118.24.3.40','HK139bc&*') #实例化,只连接一次 28 r1.op_hash('sseeffrr') 29 res=r1.op_str('k')
封装MyDb类
1 import pymysql 2 3 4 class MyDb: 5 def __init__(self, host, password, user, db, port=3306, charset='utf8', autocommit=True): 6 try: 7 self.coon = pymysql.connect(host=host, password=password, 8 user=user, db=db, port=port, 9 charset=charset, autocommit=autocommit) 10 except Exception as e: 11 print('数据库连接失败,错误信息是%s' % e) 12 raise Exception('mysql') #主动抛出异常 13 else: 14 self.cur = self.coon.cursor(pymysql.cursors.DictCursor) 15 16 def select_all(self, sql): 17 try: 18 self.cur.execute(sql) 19 except Exception as e: 20 res = 'sql语句错误, %s \n 错误的sql是 【%s】' % (e, sql) 21 print(res) 22 else: 23 res = self.cur.fetchall() 24 return res 25 26 def select_one(self, sql): 27 try: 28 self.cur.execute(sql) 29 except Exception as e: 30 res = 'sql语句错误, %s \n 错误的sql是 【%s】' % (e, sql) 31 print(res) 32 else: 33 res = self.cur.fetchone() 34 return res 35 36 def other_sql(self, sql): # 执行update,delete语句 37 try: 38 self.cur.execute(sql) 39 except Exception as e: 40 res = 'sql语句错误, %s \n 错误的sql是 【%s】' % (e, sql) 41 print(res) 42 return res 43 44 def close(self): 45 print('数据关闭了!') 46 self.cur.close() 47 self.coon.close() 48 49 50 db1 = MyDb(host='118.24.3.40', password='123456', user='jxz', db='jxz') 51 res = db1.other_sql('insert into user_info (name,pwd) VALUES ("xhy","8a1d3d135da4f52a5d88814c86d1d31a")') 52 res = db1.select_all('select * from user_info') 53 print('1=====', res) 54 res = db1.select_one('select * from user_info') 55 print('2=====', res) 56 db1.close() 57 58 59 # MyDb('118.24.3.40', 'sefff', 'sefefff', 'efgreee') 60 # MyDb.select_one('select * from xxx') 61 # MyDb.close()
1 1===== [{'pwd': '9efff14ffae2c67bafeca07c9c58518c', 'name': 'fanxiang'}, {'pwd': '3c91f100248292b9efc405d5df2196f2', 'name': 'bianzhide'}, {'pwd': '9003d1df22eb4d3820015070385194c8', 'name': 'mll'}, {'pwd': '9003d1df22eb4d3820015070385194c8', 'name': 'hwm'}, {'pwd': '9003d1df22eb4d3820015070385194c8', 'name': 'hwm'}, {'pwd': '9003d1df22eb4d3820015070385194c8', 'name': 'hwm'}, {'pwd': '9003d1df22eb4d3820015070385194c8', 'name': 'hwm'}, {'pwd': '9003d1df22eb4d3820015070385194c8', 'name': 'hwm'}, {'pwd': '8a1d3d135da4f52a5d88814c86d1d31a', 'name': 'xhy'}] 2 2===== {'pwd': '9efff14ffae2c67bafeca07c9c58518c', 'name': 'fanxiang'} 3 数据关闭了!