<h1 id="面向对象及异常处理" data-source-line="1">面向对象及异常处理
<h3 id="内置函数" data-source-line="3">内置函数
<ul data-source-line="5">
总结:__init__、__del__、__str__、attr系列、item系列、__call__
__str__与__repr__
算术运算符重载
- 示例:
</span><span style="color: #008000">#</span><span style="color: #008000"> 对象出现在'+'左边时会<a href="/tag/zidong/" target="_blank" class="keywords">自动</a>触发</span>
<span style="color: #0000ff">def</span> <span style="color: #800080">__add__</span><span style="color: #000000">(self,other):
</span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">__add__</span><span style="color: #800000">'</span><span style="color: #000000">)
</span><span style="color: #0000ff">return</span> self.num +<span style="color: #000000"> other
</span><span style="color: #008000">#</span><span style="color: #008000"> 对象出现在'+'右边是会<a href="/tag/zidong/" target="_blank" class="keywords">自动</a>触发</span>
<span style="color: #0000ff">def</span> <span style="color: #800080">__radd__</span><span style="color: #000000">(self,other):
</span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">__radd__</span><span style="color: #800000">'</span><span style="color: #000000">)
</span><span style="color: #0000ff">return</span> self.num +<span style="color: #000000"> other
</span><span style="color: #008000">#</span><span style="color: #008000"> +=运算时会<a href="/tag/zidong/" target="_blank" class="keywords">自动</a>触发,没有时会触发 __add__</span>
<span style="color: #0000ff">def</span> <span style="color: #800080">__iadd__</span><span style="color: #000000">(self,other):
</span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">__iadd__</span><span style="color: #800000">'</span><span style="color: #000000">)
</span><span style="color: #0000ff">return</span> Number(self.num +<span style="color: #000000"> other)
n
= Number(100<span style="color: #000000">)ret = n + 200<span style="color: #000000">
ret = 200 +<span style="color: #000000"> n
<span style="color: #0000ff">print<span style="color: #000000">(ret)
n += 200 <span style="color: #008000">#<span style="color: #008000"> n = n + 200
<span style="color: #0000ff">print(n)
- 自己测试
关系运算符重载
示例
</span><span style="color: #0000ff">def</span> <span style="color: #800080">__gt__</span><span style="color: #000000">(self,other):
</span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">__gt__</span><span style="color: #800000">'</span><span style="color: #000000">)
</span><span style="color: #0000ff">return</span> self.num > 200
<span style="color: #0000ff">def</span> <span style="color: #800080">__lt__</span><span style="color: #000000">(self,other):
</span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">__lt__</span><span style="color: #800000">'</span><span style="color: #000000">)
</span><span style="color: #0000ff">return</span> self.num <<span style="color: #000000"> other
</span><span style="color: #0000ff">def</span> <span style="color: #800080">__eq__</span><span style="color: #000000">(self,other):
</span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">__eq__</span><span style="color: #800000">'</span><span style="color: #000000">)
</span><span style="color: #0000ff">return</span> self.num ==<span style="color: #000000"> other
</span><span style="color: #008000">#</span><span style="color: #008000"> 当没有此<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>时,使用!=也会触发__eq__<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a></span>
<span style="color: #0000ff">def</span> <span style="color: #800080">__ne__</span><span style="color: #000000">(self,other):
</span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">__ne__</span><span style="color: #800000">'</span><span style="color: #000000">)
</span><span style="color: #0000ff">return</span> self.num !=<span style="color: #000000"> other
n
= Number(100<span style="color: #000000">) <span style="color: #008000">#<span style="color: #008000"> print(n > 200)<span style="color: #008000"> <span style="color: #008000"> print(200 > n)<span style="color: #008000"><span style="color: #008000"> print(200 == n)
<span style="color: #0000ff">print(200 != n)
引用计数
- python中的所有变量都是对象,对象的管理采用的时引用计数的方式
- 当多一个变量指向对象计数值加1,当少一个变指向对象计数值减1,减到0是,释放对象(
__del__
)
-
函数传参
-
深浅拷贝
(p1 =<span style="color: #000000"> Person()
p2 =<span style="color: #000000"> p1
<span style="color: #0000ff">print<span style="color: #000000">(id(p1))
<span style="color: #0000ff">print<span style="color: #000000">(id(p2))
<span style="color: #0000ff">del<span style="color: #000000"> p1
<span style="color: #0000ff">del<span style="color: #000000"> p2
<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">OVER<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">def<span style="color: #000000"> test(m):
<span style="color: #008000">#<span style="color: #008000"> m += 1
m[0] = 300
<span style="color: #008000">#<span style="color: #008000"> n = 100
n = [100,200<span style="color: #000000">]
test(n)
<span style="color: #0000ff">print<span style="color: #000000">(n)
<span style="color: #0000ff">import<span style="color: #000000"> copy
lt = [1,2,[3,4<span style="color: #000000">]]
<span style="color: #008000">#<span style="color: #008000"> 浅拷贝,只拷贝对象本身,不拷贝对象中的元素<span style="color: #008000">
<span style="color: #008000"> lt2 = lt.copy()<span style="color: #008000">
<span style="color: #008000"> 浅拷贝
lt2 =<span style="color: #000000"> copy.copy(lt)
<span style="color: #008000">#<span style="color: #008000"> 深拷贝:不但拷贝对象本身,还拷贝对象中的元素
lt2 =<span style="color: #000000"> copy.deepcopy(lt)
lt[0] = 100<span style="color: #000000">
lt2 = 300
<span style="color: #0000ff">print<span style="color: #000000">(id(lt))
<span style="color: #0000ff">print<span style="color: #000000">(id(lt2))
<span style="color: #0000ff">print<span style="color: #000000">(lt)
<span style="color: #0000ff">print(lt2)
-
示例:
<span style="color: #0000ff">class<span style="color: #000000"> Person:
<span style="color: #0000ff">def <span style="color: #800080">init<span style="color: #000000">(self,name,age):
self.name =<span style="color: #000000"> name
self.age =<span style="color: #000000"> age
</span><span style="color: #0000ff">def</span> <span style="color: #800080">__str__</span><span style="color: #000000">(self):
</span><span style="color: #0000ff">return</span> <span style="color: #800000">'</span><span style="color: #800000">name:{},age:{}</span><span style="color: #800000">'</span><span style="color: #000000">.format(self.name,self.age)
xiaoming = Person(<span style="color: #800000">'<span style="color: #800000">xiaoming<span style="color: #800000">',20<span style="color: #000000">)
<span style="color: #008000">#<span style="color: #008000"> 转换为bytes类型
<span style="color: #008000">#<span style="color: #008000"> s = pickle.dumps(xiaoming)<span style="color: #008000">
<span style="color: #008000"> print(s)
<span style="color: #008000">#<span style="color: #008000"> 从字节流中提取对象<span style="color: #008000">
<span style="color: #008000"> xm = pickle.loads(s)
<span style="color: #008000">#<span style="color: #008000"> print(xm)<span style="color: #008000">
<span style="color: #008000"> 保存到文件中<span style="color: #008000">
<span style="color: #008000"> fp = open('data.txt','wb')
<span style="color: #008000">#<span style="color: #008000"> pickle.dump(xiaoming,fp)<span style="color: #008000">
<span style="color: #008000"> 从文件中获取对象
<span style="color: #000000">
fp = open(<span style="color: #800000">'<span style="color: #800000">data.txt<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">rb<span style="color: #800000">'<span style="color: #000000">)
xm =<span style="color: #000000"> pickle.load(fp)
<span style="color: #0000ff">print(xm)
相关概念
-
异常处理
- 说明:异常处理可以理解为特殊的流程控制语句,可以提高代码的健壮性。
-
异常语法:
(代码
3/
(<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">其他内容<span style="color: #800000">')
多个异常
分类捕获异常
<span style="color: #0000ff">try
<span style="color: #000000">:
<span style="color: #008000">#<span style="color: #008000"> print(a)
<span style="color: #008000">#<span style="color: #008000"> 3/0
fp = open(<span style="color: #800000">'<span style="color: #800000">123.txt<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">except<span style="color: #000000"> (NameError,ZeroDivisionError) as e:
<span style="color: #008000">#<span style="color: #008000"> 将某些异常进行统一处理,写在一个元组中即可
<span style="color: #0000ff">print<span style="color: #000000">(e)
<span style="color: #0000ff">except<span style="color: #000000">:
<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">其他异常<span style="color: #800000">')
-
完整结构(else-finally)
(代码
(
(
(后执行)
else:正常结束时执行else中的代码
finally:无论有无异常,最后都执行
-
抛出异常:raise
(代码
Exception((<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">OVER<span style="color: #800000">')
-
异常嵌套(try-except结构中再次使用try-except结构)
(( Exception((( Exception((((<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">热情满满的开始一天的工作<span style="color: #800000">')
-
自定义异常类(需要继承自官方的异常基类Exception)
自定义异常类
=</span><span style="color: #0000ff">def</span> <span style="color: #800080">__str__</span><span style="color: #000000">(self):
</span><span style="color: #0000ff">return</span><span style="color: #000000"> self.msg
</span><span style="color: #008000">#</span><span style="color: #008000"> 特定异常标准处理方案</span>
<span style="color: #0000ff">def</span><span style="color: #000000"> deal(self):
</span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">处理特定的<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>异常</span><span style="color: #800000">'</span><span style="color: #000000">)
<span style="color: #0000ff">try<span style="color: #000000">:
<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">正常执行<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #008000">#<span style="color: #008000"> 手动抛出自定义异常
<span style="color: #0000ff">raise MyException(<span style="color: #800000">'<span style="color: #800000">出现了自定义异常<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">except<span style="color: #000000"> MyException as e:
<span style="color: #0000ff">print<span style="color: #000000">(e)
<span style="color: #008000">#<span style="color: #008000"> 调用方法,处理异常
e.deal()
为什么使用虚拟环境?
- 当一台电脑上不同软件需要依赖同一个包的不同版本时,为了进行环境隔离就出现了虚拟环境
- 安装工具:
virtualenv
pip install virtualenv
- 创建虚拟环境
virtualenv 虚拟环境目录名
- 激活虚拟环境
- 进入虚拟环境目录的
Scripts
目录
- 执行:
activate
- 退出虚拟环境
- 进入虚拟环境目录的
Scripts
目录
- 执行:
deactivate.bat
- 冷冻一个环境依赖包
- 执行:
pip freeze > requirements.txt
- 快速复制一个虚拟环境
- 创建一个虚拟环境
- 激活虚拟环境
- 执行:
pip install -r requirements.txt
引用计数
- python中的所有变量都是对象,对象的管理采用的时引用计数的方式
- 当多一个变量指向对象计数值加1,当少一个变指向对象计数值减1,减到0是,释放对象(
__del__
)
函数传参
深浅拷贝
p2 =<span style="color: #000000"> p1 <span style="color: #0000ff">print<span style="color: #000000">(id(p1))
<span style="color: #0000ff">print<span style="color: #000000">(id(p2)) <span style="color: #0000ff">del<span style="color: #000000"> p1
<span style="color: #0000ff">del<span style="color: #000000"> p2
<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">OVER<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">def<span style="color: #000000"> test(m):
<span style="color: #008000">#<span style="color: #008000"> m += 1
m[0] = 300
<span style="color: #008000">#<span style="color: #008000"> n = 100
n = [100,200<span style="color: #000000">]
test(n)
<span style="color: #0000ff">print<span style="color: #000000">(n)
<span style="color: #0000ff">import<span style="color: #000000"> copy
lt = [1,2,[3,4<span style="color: #000000">]]
<span style="color: #008000">#<span style="color: #008000"> 浅拷贝,只拷贝对象本身,不拷贝对象中的元素<span style="color: #008000">
<span style="color: #008000"> lt2 = lt.copy()<span style="color: #008000">
<span style="color: #008000"> 浅拷贝
lt2 =<span style="color: #000000"> copy.copy(lt)
<span style="color: #008000">#<span style="color: #008000"> 深拷贝:不但拷贝对象本身,还拷贝对象中的元素
lt2 =<span style="color: #000000"> copy.deepcopy(lt)
lt[0] = 100<span style="color: #000000">
lt2 = 300
<span style="color: #0000ff">print<span style="color: #000000">(id(lt))
<span style="color: #0000ff">print<span style="color: #000000">(id(lt2))
<span style="color: #0000ff">print<span style="color: #000000">(lt)
<span style="color: #0000ff">print(lt2)
-
示例:
<span style="color: #0000ff">class<span style="color: #000000"> Person:
<span style="color: #0000ff">def <span style="color: #800080">init<span style="color: #000000">(self,name,age):
self.name =<span style="color: #000000"> name
self.age =<span style="color: #000000"> age</span><span style="color: #0000ff">def</span> <span style="color: #800080">__str__</span><span style="color: #000000">(self): </span><span style="color: #0000ff">return</span> <span style="color: #800000">'</span><span style="color: #800000">name:{},age:{}</span><span style="color: #800000">'</span><span style="color: #000000">.format(self.name,self.age)
xiaoming = Person(<span style="color: #800000">'<span style="color: #800000">xiaoming<span style="color: #800000">',20<span style="color: #000000">)
<span style="color: #008000">#<span style="color: #008000"> 转换为bytes类型<span style="color: #008000">#<span style="color: #008000"> s = pickle.dumps(xiaoming)<span style="color: #008000">
<span style="color: #008000"> print(s)
<span style="color: #008000">#<span style="color: #008000"> 从字节流中提取对象<span style="color: #008000">
<span style="color: #008000"> xm = pickle.loads(s)
<span style="color: #008000">#<span style="color: #008000"> print(xm)<span style="color: #008000">
<span style="color: #008000"> 保存到文件中<span style="color: #008000">
<span style="color: #008000"> fp = open('data.txt','wb')
<span style="color: #008000">#<span style="color: #008000"> pickle.dump(xiaoming,fp)<span style="color: #008000">
<span style="color: #008000"> 从文件中获取对象
<span style="color: #000000">
fp = open(<span style="color: #800000">'<span style="color: #800000">data.txt<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">rb<span style="color: #800000">'<span style="color: #000000">)
xm =<span style="color: #000000"> pickle.load(fp)
<span style="color: #0000ff">print(xm)
相关概念
-
异常处理
- 说明:异常处理可以理解为特殊的流程控制语句,可以提高代码的健壮性。
-
异常语法:
(代码
3/
(<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">其他内容<span style="color: #800000">')
多个异常
分类捕获异常
<span style="color: #0000ff">try
<span style="color: #000000">:
<span style="color: #008000">#<span style="color: #008000"> print(a)
<span style="color: #008000">#<span style="color: #008000"> 3/0
fp = open(<span style="color: #800000">'<span style="color: #800000">123.txt<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">except<span style="color: #000000"> (NameError,ZeroDivisionError) as e:
<span style="color: #008000">#<span style="color: #008000"> 将某些异常进行统一处理,写在一个元组中即可
<span style="color: #0000ff">print<span style="color: #000000">(e)
<span style="color: #0000ff">except<span style="color: #000000">:
<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">其他异常<span style="color: #800000">')
-
完整结构(else-finally)
(代码
(
(
(后执行)
else:正常结束时执行else中的代码
finally:无论有无异常,最后都执行
-
抛出异常:raise
(代码
Exception((<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">OVER<span style="color: #800000">')
-
异常嵌套(try-except结构中再次使用try-except结构)
(( Exception((( Exception((((<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">热情满满的开始一天的工作<span style="color: #800000">')
-
自定义异常类(需要继承自官方的异常基类Exception)
自定义异常类
=</span><span style="color: #0000ff">def</span> <span style="color: #800080">__str__</span><span style="color: #000000">(self):
</span><span style="color: #0000ff">return</span><span style="color: #000000"> self.msg
</span><span style="color: #008000">#</span><span style="color: #008000"> 特定异常标准处理方案</span>
<span style="color: #0000ff">def</span><span style="color: #000000"> deal(self):
</span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">处理特定的<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>异常</span><span style="color: #800000">'</span><span style="color: #000000">)
<span style="color: #0000ff">try<span style="color: #000000">:
<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">正常执行<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #008000">#<span style="color: #008000"> 手动抛出自定义异常
<span style="color: #0000ff">raise MyException(<span style="color: #800000">'<span style="color: #800000">出现了自定义异常<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">except<span style="color: #000000"> MyException as e:
<span style="color: #0000ff">print<span style="color: #000000">(e)
<span style="color: #008000">#<span style="color: #008000"> 调用方法,处理异常
e.deal()
为什么使用虚拟环境?
- 当一台电脑上不同软件需要依赖同一个包的不同版本时,为了进行环境隔离就出现了虚拟环境
- 安装工具:
virtualenv
pip install virtualenv
- 创建虚拟环境
virtualenv 虚拟环境目录名
- 激活虚拟环境
- 进入虚拟环境目录的
Scripts
目录
- 执行:
activate
- 退出虚拟环境
- 进入虚拟环境目录的
Scripts
目录
- 执行:
deactivate.bat
- 冷冻一个环境依赖包
- 执行:
pip freeze > requirements.txt
- 快速复制一个虚拟环境
- 创建一个虚拟环境
- 激活虚拟环境
- 执行:
pip install -r requirements.txt
相关概念
异常处理
- 说明:异常处理可以理解为特殊的流程控制语句,可以提高代码的健壮性。
异常语法:
多个异常
<span style="color: #0000ff">try
<span style="color: #000000">:<span style="color: #008000">#<span style="color: #008000"> print(a)
<span style="color: #008000">#<span style="color: #008000"> 3/0
fp = open(<span style="color: #800000">'<span style="color: #800000">123.txt<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">except<span style="color: #000000"> (NameError,ZeroDivisionError) as e:
<span style="color: #008000">#<span style="color: #008000"> 将某些异常进行统一处理,写在一个元组中即可
<span style="color: #0000ff">print<span style="color: #000000">(e)
<span style="color: #0000ff">except<span style="color: #000000">:
<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">其他异常<span style="color: #800000">')
完整结构(else-finally)
else:正常结束时执行else中的代码
finally:无论有无异常,最后都执行
抛出异常:raise
异常嵌套(try-except结构中再次使用try-except结构)
自定义异常类(需要继承自官方的异常基类Exception)
</span><span style="color: #0000ff">def</span> <span style="color: #800080">__str__</span><span style="color: #000000">(self):
</span><span style="color: #0000ff">return</span><span style="color: #000000"> self.msg
</span><span style="color: #008000">#</span><span style="color: #008000"> 特定异常标准处理方案</span>
<span style="color: #0000ff">def</span><span style="color: #000000"> deal(self):
</span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">处理特定的<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>异常</span><span style="color: #800000">'</span><span style="color: #000000">)
<span style="color: #0000ff">try<span style="color: #000000">:<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">正常执行<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #008000">#<span style="color: #008000"> 手动抛出自定义异常
<span style="color: #0000ff">raise MyException(<span style="color: #800000">'<span style="color: #800000">出现了自定义异常<span style="color: #800000">'<span style="color: #000000">)
<span style="color: #0000ff">except<span style="color: #000000"> MyException as e:
<span style="color: #0000ff">print<span style="color: #000000">(e)
<span style="color: #008000">#<span style="color: #008000"> 调用方法,处理异常
e.deal()
- 为什么使用虚拟环境?
- 当一台电脑上不同软件需要依赖同一个包的不同版本时,为了进行环境隔离就出现了虚拟环境
- 安装工具:
virtualenv
pip install virtualenv
- 创建虚拟环境
virtualenv 虚拟环境目录名
- 激活虚拟环境
- 进入虚拟环境目录的
Scripts
目录 - 执行:
activate
- 进入虚拟环境目录的
- 退出虚拟环境
- 进入虚拟环境目录的
Scripts
目录 - 执行:
deactivate.bat
- 进入虚拟环境目录的
- 冷冻一个环境依赖包
- 执行:
pip freeze > requirements.txt
- 执行:
- 快速复制一个虚拟环境
- 创建一个虚拟环境
- 激活虚拟环境
- 执行:
pip install -r requirements.txt