加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python基础—13-面向对象及异常处理

发布时间:2020-12-17 00:23:00 所属栏目:Python 来源:网络整理
导读: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__ 使用print/str方法时会

<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__

    • 使用print/str方法时会自动触发__str__方法,当__str__不存在,尝试__repr__
    • 使用repr方法时会自动触发__repr__方法
    • repr方法通常用于返回对象的字符串表示形式
    • 这两个方法都只能返回字符串
    • eval方法可以将一个字符串当做有效的代码执行
  • 算术运算符重载

    • 示例:
    =</span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 对象出现在'+'左边时会自动触发</span> <span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__add__</span><span style="color: #000000"&gt;(self,other): </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;__add__</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;) </span><span style="color: #0000ff"&gt;return</span> self.num +<span style="color: #000000"&gt; other </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 对象出现在'+'右边是会自动触发</span> <span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__radd__</span><span style="color: #000000"&gt;(self,other): </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;__radd__</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;) </span><span style="color: #0000ff"&gt;return</span> self.num +<span style="color: #000000"&gt; other </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; +=运算时会自动触发,没有时会触发 __add__</span> <span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__iadd__</span><span style="color: #000000"&gt;(self,other): </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;__iadd__</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;) </span><span style="color: #0000ff"&gt;return</span> Number(self.num +<span style="color: #000000"&gt; 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"&gt;def</span> <span style="color: #800080"&gt;__gt__</span><span style="color: #000000"&gt;(self,other): </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;__gt__</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;) </span><span style="color: #0000ff"&gt;return</span> self.num > 200 <span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__lt__</span><span style="color: #000000"&gt;(self,other): </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;__lt__</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;) </span><span style="color: #0000ff"&gt;return</span> self.num <<span style="color: #000000"&gt; other </span><span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__eq__</span><span style="color: #000000"&gt;(self,other): </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;__eq__</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;) </span><span style="color: #0000ff"&gt;return</span> self.num ==<span style="color: #000000"&gt; other </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 当没有此方法时,使用!=也会触发__eq__方法</span> <span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__ne__</span><span style="color: #000000"&gt;(self,other): </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;__ne__</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;) </span><span style="color: #0000ff"&gt;return</span> self.num !=<span style="color: #000000"&gt; 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"&gt;def</span> <span style="color: #800080"&gt;__str__</span><span style="color: #000000"&gt;(self):
          </span><span style="color: #0000ff"&gt;return</span> <span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;name:{},age:{}</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;.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)

      相关概念

      • 错误:程序运行之前的语法问题,如:关键字、缩进、括号不成对等
      • 异常:在程序运行过程中出现的问题,如:未定义变量、除数为0、属性不存在等
    • 异常处理

      • 说明:异常处理可以理解为特殊的流程控制语句,可以提高代码的健壮性。
    • 异常语法:

      ( 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"&gt;def</span> <span style="color: #800080"&gt;__str__</span><span style="color: #000000"&gt;(self): </span><span style="color: #0000ff"&gt;return</span><span style="color: #000000"&gt; self.msg </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 特定异常标准处理方案</span> <span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; deal(self): </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;处理特定的自定义异常</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;)

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

      特殊场景

      • 当我们进行文件操作时,无论过程中是否有异常,最终我们一定得进行关闭操作
      • 使用with语句,可以保证文件的关闭,无论中间过程是否出现异常
      ,= fp.read(5

      为什么使用虚拟环境?
      • 当一台电脑上不同软件需要依赖同一个包的不同版本时,为了进行环境隔离就出现了虚拟环境
    • 安装工具:virtualenv
      • pip install virtualenv
    • 创建虚拟环境
      • virtualenv 虚拟环境目录名
    • 激活虚拟环境
      • 进入虚拟环境目录的Scripts目录
      • 执行:activate
    • 退出虚拟环境
      • 进入虚拟环境目录的Scripts目录
      • 执行:deactivate.bat
    • 冷冻一个环境依赖包
      • 执行:pip freeze > requirements.txt
    • 快速复制一个虚拟环境
      • 创建一个虚拟环境
      • 激活虚拟环境
      • 执行:pip install -r requirements.txt

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读