day027学习笔记
内置方法
-
魔法方法
- __所包围的一些python自带的方法
- 某种情况下会被自动调用
-
类中内置方法
class Person: def __new__(cls, *args, **kwargs): print("new创建对象的方法") return object.__new__(cls) def __init__(self): self.name = 1 print("用来初始化对象,构造方法或构造器") def __del__(self): #在程序结束时会被垃圾回收机制自动调用以释放内存 print("析构器,析构方法,在对象被删除时,自动调用") def __len__(self): return 666 def __str__(self): return "人类对象,有{}{}方法{}{}对象" xiaoming = Person() del xiaoming #调用__del__方法 lis = [1,2,3,4,5,6,7,8] print(len(lis)) #8 调用list类的__len__方法 print(len(xiaoming)) #666 调用当前类的__len__方法 print(xiaoming) #调用当前类的__str__方法-
__new__(cls[, ...])一个对象实例化的时候所调用的第一个方法 -
__init__(self[, ...])构造器,当一个实例被创建的时候调用的初始化方法 -
__del__(self)析构器,当一个实例被销毁的时候调用的方法(建议不要重写) -
__len__通过len(obj)调用,返回值必须设置为int类型(也可以返回其它数据类型-函数失效) -
__hash__通过hash(obj)调用(一种消息摘要算法) --获取取一个对象(非可变数据类型)的哈希值 -
__str__打印对象时调用print() -
__eq__比较两个对象,判断两个对象是否相同,设置规则,调用前者的规则方法class A: def __init__(self): self.name = "xiaoming" self.age = 20 def __eq__(self, other): if self.name == other.name and self.age == other.age: return True else: return False class B: def __init__(self): self.name = "xiaoming" self.age = 20 a =A() b = B() print(a == b) #调用前者的eq方法 b.name = 111 print(a == b)
-
异常
-
概念
- 异常类-Exception
- 异常-在程序执行过程中发生的影响程序正常执行的事件(对象)
-
抛出异常
- raise语句显式的抛出异常
- Python解释器自己检测到异常并引发它(在Python无法正常处理程序时)
-
常见异常
- SyntaxError语法错误
- IndentationError多打一个空格
- NameError 使用一个还未被赋予对象的变量
- TypeError 传入对象类型与要求的不符合 (int + str)
- IOError 输入/输出异常;基本上是无法打开文件
- ImportError 无法引入模块或包;基本上是路径问题或名称错误
- IndexError 下标索引超出序列边界
- KeyError 试图访问字典里不存在的键
-
异常处理
用特定代码来捕捉异常(与当前程序逻辑无关),使程序能顺序执行
-
方式1-if条件判断,根据结果进行处理,可读性较差,代码冗长
-
方式2-try except
try: # 被检测的代码块 except 异常类型: #发生异常后接收 # 接收异常后的处理方式-
单分支:已知异常类型,用特定异常去接收
try: print(1/0) except ZeroDivisionError:#不匹配无法捕捉则会报错 print("0不能作为除数") print("后续语句") -
多分支:不同异常不同处理方式(但是一次只接收一个异常)
a = [1,2,3] try: print(1/0) #捕获到异常就抛出 print(a[5]) #不会被捕捉的异常 except ZeroDivisionError: print("除0错误") except IndexError: print("索引错误") print("后续语句") >>>除0错误 >>>后续语句使用一个except捕捉多个异常 def model_exception(x,y): try: b = name a =x/y except(ZeroDivisionError,NameError,TypeError): print('one of ZeroDivisionError or NameError or TypeError happend') #调用函数结果 model_exception(2,0) >>>one of ZeroDivisionError or NameError or TypeError happend -
万能异常:捕捉Exception类中有的异常并查看
try: print(a[5]) except Exception as e: #所有异常的处理方式是一样的 print(e) print("后续语句") >>>name 'a' is not defined >>>后续语句 -
多分支+万能异常 :已知异常用特定方法处理,最后剩下的异常统一使用万能异常处理
dic = {1: "login",2: "register",3: "dariy",4: "article",5: "comment"} print('''欢迎访问博客园系统: 1,登录 2,注册 3,访问日记页面 4,访问文章页面 5,访问评论页面''') try: choice = int(input('请输入:')) print(dic[choice]) except ValueError: print('请输入数字....') except KeyError: print('您输入的选项超出范围...') except Exception as e: print(e) -
try...except...else组合 :有异常就不执行else代码
a = [1,2,3] try: print(1/1) print(a[1]) except ZeroDivisionError: print("除0错误") else:#try后面的语句,没有任何异常,执行else后的内容 print("else") >>>1.0 >>>2 >>>else -
try...except...finally组合:最后一定要执行
finally后的语句块 (无论是否出现异常或异常捕捉到与否)(清理行为)a = [1,2,3] try: print(1/1) print(a[9]) except ZeroDivisionError: print("除0错误") else:#else try后面的语句,没有任何异常,执行else后的内容 print("else") finally:#没捕获到也一定会执行 print("肯定执行finally") print("后续语句")-
函数中,finally会在return之前先执行 (理解为独立的声明-一定执行)
def func(): try: return 1 finally: print('finally') func() >>>finally -
finally应用场景:关闭文件的链接,数据等链接时,需要用到finally
f = open('file',encoding='utf-8') try: '''各种操作''' print(f.read()) '''但是发生错误了, 此时没关闭文件句柄,所以''' finally: f.close()#无论是否正常操作最后都要关闭文件 -
循环中
while 1: try: break finally: print('finally') >>>finally -
finally总结:是做收尾工作
-
-
-
方式3:主动发出异常
raise TypeError('类型错误')raise Exception("类型错误") -
方式4: assert 断言,只要assert后面的代码不成立,直接报错
name = "小明" print("1") print("1") assert name == "小明1" #若为False后面不再执行 print("1") print("1") print("1") -
方式5:自定义异常
通过继承eException类,定义新的异常类
class Wodingyideyichang(Exception): value = "你中了我定义的异常" try: raise Wodingyideyichang() except Wodingyideyichang as e: print(e.value) >>>你中了我定义的异常
-
浙公网安备 33010602011771号