面向对象及异常处理

内置函数

  • 总结:__init__、__del__、__str__、attr系列、item系列、__call__

  • __str__与__repr__

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

    • 示例:
    class Number:
    def __init__(self, num):
    self.num = num # 对象出现在'+'左边时会自动触发
    def __add__(self, other):
    print('__add__')
    return self.num + other # 对象出现在'+'右边是会自动触发
    def __radd__(self, other):
    print('__radd__')
    return self.num + other # +=运算时会自动触发,没有时会触发 __add__
    def __iadd__(self, other):
    print('__iadd__')
    return Number(self.num + other) n = Number(100)
    ret = n + 200
    ret = 200 + n
    print(ret)
    n += 200 # n = n + 200
    print(n)
    • 自己测试
    加法:__add__、__radd__、__iadd__
    减法:__sub__、__rsub__、__isub__
    乘法:__mul__、__rmul__、__imul__
    除法:__truediv__、__rtruediv__、__itruediv__
    求余:__mod、__rmod__、__imod__
  • 关系运算符重载

    >:        __gt__
    =: __ge__
    <: __lt__
    <=: __le__
    ==: __eq__
    !=: __ne__
  • 示例

     class Number:
    def __init__(self, num):
    self.num = num def __gt__(self, other):
    print('__gt__')
    return self.num > 200 def __lt__(self, other):
    print('__lt__')
    return self.num < other def __eq__(self, other):
    print('__eq__')
    return self.num == other # 当没有此方法时,使用!=也会触发__eq__方法
    def __ne__(self, other):
    print('__ne__')
    return self.num != other n = Number(100) # print(n > 200)
    # print(200 > n)
    # print(200 == n)
    print(200 != n)

深浅拷贝

  • 引用计数

    • python中的所有变量都是对象,对象的管理采用的时引用计数的方式
    • 当多一个变量指向对象计数值加1,当少一个变指向对象计数值减1,减到0是,释放对象(__del__)
  • 函数传参

    • 对于不可变的变量来说,函数中不可能改传递过来的变量
    • 对于可变的容器对象及自定义对象,作为函数参数传递时,传递的是引用,可以修改该对象
  • 深浅拷贝

    class Person:
    def __del__(self):
    print('对象释放') p1 = Person()
    p2 = p1 print(id(p1))
    print(id(p2)) del p1
    del p2
    print('OVER') def test(m):
    # m += 1
    m[0] = 300 # n = 100
    n = [100, 200] test(n)
    print(n) import copy lt = [1, 2, [3, 4]] # 浅拷贝,只拷贝对象本身,不拷贝对象中的元素
    # lt2 = lt.copy()
    # 浅拷贝
    lt2 = copy.copy(lt) # 深拷贝:不但拷贝对象本身,还拷贝对象中的元素
    lt2 = copy.deepcopy(lt)
    lt[0] = 100
    lt2 = 300 print(id(lt))
    print(id(lt2))
    print(lt)
    print(lt2)

数据持久化(pickle)

  • 说明:数据持久化存储方案,普通文件、序列化、数据库

  • 示例:

    import pickle
    
    class Person:
    def __init__(self, name, age):
    self.name = name
    self.age = age def __str__(self):
    return 'name:{},age:{}'.format(self.name, self.age) xiaoming = Person('xiaoming', 20)
    # 转换为bytes类型 # s = pickle.dumps(xiaoming)
    # print(s) # 从字节流中提取对象
    # xm = pickle.loads(s) # print(xm)
    # 保存到文件中
    # fp = open('data.txt', 'wb') # pickle.dump(xiaoming, fp)
    # 从文件中获取对象 fp = open('data.txt', 'rb')
    xm = pickle.load(fp)
    print(xm)

异常处理

  • 相关概念

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

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

    try:
    print('正常代码')
    # print(a)
    3/0
    except Exception as e:
    # Exception 是所有异常的基类,此处可以捕获所有的异常
    print('出现异常')
    print(e) print('其他内容')
  • 多个异常

    # 分类捕获异常
    '''
    try:
    # print(a)
    # 3/0
    d = {}
    print(d['name'])
    except NameError as e:
    print('NameError:', e)
    except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
    except Exception as e:
    print('OtherError:', e)
    ''' try:
    # print(a)
    # 3/0
    fp = open('123.txt')
    except (NameError, ZeroDivisionError) as e:
    # 将某些异常进行统一处理,写在一个元组中即可
    print(e)
    except:
    print('其他异常')
  • 完整结构(else-finally)

    try:
    print('正常代码')
    print(a)
    except:
    # 出现异常时执行
    print('出现异常')
    else:
    # 正常结束(没有异常)时会执行
    print('正常结束')
    finally:
    # 无论有无异常,都会执行
    print('最后执行')

    else:正常结束时执行else中的代码

    finally:无论有无异常,最后都执行

  • 抛出异常:raise

    try:
    print('正常代码')
    # 根据业务逻辑的需要,手动抛出异常
    raise Exception('手动抛出的异常')
    except Exception as e:
    print('异常:', e) print('OVER')
  • 异常嵌套(try-except结构中再次使用try-except结构)

    print('我要去上班,什么事也阻止不了我上班的脚步')
    try:
    print('我准备骑电动车')
    raise Exception('昨天晚上不知道哪个缺德的家伙把我充电器拔了')
    print('骑车提前到达公司')
    except Exception as e:
    print(e)
    try:
    print('我准备做公交车')
    raise Exception('等了20分钟一直没有公交车,果断放弃')
    print('坐公交车准时到达公司')
    except Exception as e:
    print(e)
    print('我准备打车')
    print('打车还是快,一会就到达公司') print('热情满满的开始一天的工作')
  • 自定义异常类(需要继承自官方的异常基类Exception)

    # 自定义异常类
    class MyException(Exception):
    def __init__(self, msg):
    self.msg = msg def __str__(self):
    return self.msg # 特定异常标准处理方案
    def deal(self):
    print('处理特定的自定义异常') try:
    print('正常执行')
    # 手动抛出自定义异常
    raise MyException('出现了自定义异常')
    except MyException as e:
    print(e)
    # 调用方法,处理异常
    e.deal()
  • 特殊场景

    • 当我们进行文件操作时,无论过程中是否有异常,最终我们一定得进行关闭操作
    • 使用with语句,可以保证文件的关闭,无论中间过程是否出现异常
    # fp = open('test.txt', 'r')
    # 中间无论有无异常,最后一定得关闭文件
    # fp.close() with open('test.txt', 'r') as fp:
    content = fp.read(5)
    print(content)
    # 此处不要考虑文件的关闭问题,也不用是否有异常

虚拟环境

  • 为什么使用虚拟环境?

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

Python基础—13-面向对象及异常处理的更多相关文章

  1. Python 基础之面向对象之异常处理

    一.认识异常 1.常用异常报错的错误类型 IndexError                索引超出序列的范围 KeyError                  字典中查找一个不存在的关键字 Na ...

  2. python基础(13)-面向对象

    类 类的定义和使用 # class Person: def __init__(self, name, age, gender): self.name = name self.age = age sel ...

  3. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  4. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  5. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  6. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

  7. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  8. 二十. Python基础(20)--面向对象的基础

    二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...

  9. 十三. Python基础(13)--生成器进阶

    十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...

  10. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

随机推荐

  1. geth

    >geth --networkid 123 --dev --datadir "d:/blockchain/project/ethereum" --rpc --rpcaddr ...

  2. 虚拟环境--pipenv

    1.安装pipenv,这个工具属于python3 升级pip : pip3 install pipenv 2.在项目中创建虚拟环境 3.激活虚拟环境,进入虚拟环境 进入虚拟环境之前: pipenv s ...

  3. js正则验证表达式

    //上传文件大小验证 $.fn.checkFileTypeAndSize = function (options) { //默认设置 var defaults = { allowedExtension ...

  4. axios 发 post 请求,后端接收不到参数的解决方案

    问题场景 场景很简单,就是一个正常 axios post 请求: axios({ headers: { 'deviceCode': 'A95ZEF1-47B5-AC90BF3' }, method: ...

  5. centOs升级

    因为军佬放弃制作Centos7的网络重装包,又Centos7的安装引导和6有较大区别所以,选择曲线救国(技术不行,只能这样乱搞)前文:Centos6.9一键重装包https://ppx.ink/net ...

  6. javascript实现数据结构: 串的块链存储表示

    和线性表的链式存储结构相类似,也可采用链式方式存储串值.由于串结构的特殊性--结构中的每个数据元素是一个字符,则用链表存储串值时,存在一个“结点大小”的问题,即每个结点可以存放一个字符,也可以存放多个 ...

  7. How To Capture Packets with TCPDUMP?

    http://linux-circles.blogspot.com/2012/11/how-to-capture-packets-with-tcpdump.html See the list of i ...

  8. 深入浅出 关于SQL Server中的死锁问题

    深入浅出 关于SQL Server中的死锁问题 博客2013-02-12 13:44   分享到:我要吐槽 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相 ...

  9. /etc/hosts.allow和/etc/hosts.deny详解

    今天遇到一台服务器22端口正常,但是通过ssh连接的问题.排查了防火墙和端口问题,半天没有找出来原因,后来求助大神,终于明白了通过etc目录下hosts.deny和hosts.allow文件可以限制远 ...

  10. IEEP-网络规划

    HCNP-R&S证书是公认人具备中小型企业网络构建和管理能力的专业人士   IEEP包含五个方面内容 1.网络规划与设计 2.网络实施与维护 3.网络排障 4.网络优化 5.网络割接     ...