【day8】异常处理/

 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)。

实例化

    • 创建一个类的实例,类的具体对象。

方法

    • 类中定义的函数。
    • 方法存放在类中。对象调用方法时,找到类方法的内存地址并调用它。

对象

    • 通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

构造函数 :

    • 是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
    • 特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载
    • 类在实例化后,会自动执行构造函数。
    • 构造函数不是必须写的。
    • 类在实例化时,是否传参,是根据构造函数是否需要传参决定的。
    • 例如,连接数据库类,写在构造函数里,类实例化后,会去连接,而且只需要连接一次。

  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 能住人
View Result

封装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 数据关闭了!
View Result

猜你喜欢

转载自www.cnblogs.com/xhybk/p/9365373.html