解析python高级异常和运算符重载

目录
  • 一、高级异常
  • 二、环境管理器
    • 2.1、对象的属性管理函数
  • 三、运算符重载
    • 3.1、算术运算符的重载
  • 四、反向算术运算符的重载
  • 五、复合赋值算术运算符的重载
  • 六、比较运算符的重载
  • 七、位运算符重载
  • 八、反向位运算符重载
  • 九、复合赋值位运算符重载
  • 十、一元运算符的重载
  • 十一、in / not in 运算符的重载
  • 十二、索引和切片运算符的重载
  • 十三、slice 构造函数

一、高级异常

回顾异常相关的语句:

try-except:用来捕获异常的通知

try-finally:用来做一定要做的事

reise:用来发生异常通知

assert:用来根据条件来发出AssertionError类型的异常通知

with语句:

语句: with 表达式1 [as 变量1],表达式2 [as 变量2]:

         语句块

作用:使用于对资源进行访问的场合,确保使用过程中不管是否发生异常,都会执行必须的'清理'操作,并释放资源

如:文件使用后自动关闭;线程中锁定的自动获取和释放等

用with语句代替try-finally语句

def read_from_file(filename='info.txt'):
     try:
         with open(filename) as f:
             print("正在读取文件")
             n = int(f.read())
             print('n=', n)
             print('文件已经关闭')
         # f = open(filename)
         # try:
         #     print("正在读取文件")
         #     n = int(f.read())
         #     print("n=", n)
         # finally:
         #     f.close()
         #     print("文件已经关闭")
     except OSError:
         print("文件打开失败")

 read_from_file()

二、环境管理器

1、类内有__enter__和__exit__实例方法的类被称为环境管理器

2、能够用with语句管理的对象必须是环境管理器

3、 __enter__方法将在进入with语句时被调用,并返回由as变量管理的对象

4、__exit__将在离开with语句时被调用,且可以用参数来判断在离开with语句时是否有异常发生并做出相应的处理

class A:
     def __enter__(self):
         print("已进入with语句")
         return self  # 返回的对象将由 as绑定

     def __exit__(self, exc_type, exc_val, exc_tb):
         print("已离开with语句")
 # a = A()
 with A() as a:
     print("这是with语句内的一条语句")
     int(input("请输入整数: "))

已进入with语句

这是with语句内的一条语句

请输入整数: 2

2.1、对象的属性管理函数

1、getattr(obj, name[, default])从一个对象得到对象的属性;getattr(x, 'y')等同于x.y;当属性不存在时,如果给出default参数,则返回default,如果没有给出default则产生一个AttributeError错误

2、hasattr(obj, name)用给定的name返回对象obj是否有此属性,此种做法可以避免在getattr(obj, name)时引发错误

3、setattr(obj, name, value)给对象obj的名为name的属性设置相应的值value, set(x,'y', v) 等同于 x.y = v

4、delattr(obj, name)删除对象obj中的name属性,delattr(x, 'y') 等同于 del x.y

class Car:
     def __init__(self, c, b):
         self.color, self.brand = c, b

     def get_car_attr(self, attr_name):
         '''此方法用于获取对象的属性,如果属性名attr_name
         在此对象内不存在则返回 None
         '''
         return getattr(self, attr_name, None)

 c1 = Car('黑色', 'Benz')
 v = c1.get_car_attr('color')
 # try:
 #     v = c1.__dict__['aaaaa']
 # except KeyError:
 #     v = None
 if v is None:
     print("没有颜色属性")
 else:
     print("颜色是:", v)

getatter(obj,name[,default])

三、运算符重载

让自定义的类生成的对象(实例)能够使用运算符进行操作

作用:让自定义的类的实例像内建对象一样能够运行运算符操作,让程序简单易读,对自定义的对象,将运算符赋予新的运算规则

3.1、算术运算符的重载

__add__(self, rhs)      self + rhs    加法
__sub__(self, rhs)       self - rhs    减法
__mul__(self, rhs)       self * rhs    乘法
__truediv__(self, rhs)   self / rhs    除法
__floordiv__(self, rhs)    self // rhs   地板除法
__mod__(self, rhs)       self % rhs    求余
__pow__(self, rhs)       self ** rhs   冪

注: rhs (right hands side) 右手边

class MyNumber:
     def __init__(self, v):
         self.data = v

     def __repr__(self):
        return 'MyNumber(%d)' % self.data

     # def myadd(self, other):
     #     v = self.data + other.data
     #     return MyNumber(v)

     def __add__(self, other):
        print("__add__被调用")
         v = self.data + other.data
         return MyNumber(v)

     def __sub__(self, rhs):
         v = self.data - rhs.data
         return MyNumber(v)

 n1 = MyNumber(100)
 n2 = MyNumber(200)
 # n3 = n1.myadd(n2)
 # n3 = n1.__add__(n2)
 n3 = n1 + n2  # __add__被调用
 print(n3)   # MyNumber(300)
 n4 = n3 - n2
 print(n4)   # MyNumber(100)
class MyList:
     def __init__(self, iterable):
         self.data = list(iterable)

     def __add__(self, rhs):
         return MyList(self.data + rhs.data)

     def __repr__(self):
         return 'MyList(%r)' % self.data

     def __mul__(self, rhs):  # rhs 绑定整数
         return MyList(self.data * rhs)

 L1 = MyList([1, 2, 3])
 L2 = MyList([4, 5, 6])
 L3 = L1 + L2  # 等同于L1.__add__(L2)
 print(L3)  # MyList([1,2,3,4,5,6])
 L4 = L2 + L1  # 等同于L2.__add__(L1)
 print(L4)  # MyList([4,5,6,1,2,3])
 L5 = L1 * 2  # L1.__mul__(2)
 print(L5)  # MyList([1,2,3,1,2,3])

四、反向算术运算符的重载

__radd__(self, lhs)      lhs + self    加法
__rsub__(self, lhs)      lhs - self    减法
__rmul__(self, lhs)      lhs * self    乘法
__rtruediv__(self, lhs)    lhs / self    除法
__rfloordiv__(self, lhs)   lhs // self   地板除法
__rmod__(self, lhs)      lhs % self    求余
__rpow__(self, lhs)      lhs ** self   冪

class MyList:
     def __init__(self, iterable):
         self.data = list(iterable)

     def __add__(self, rhs):
         return MyList(self.data + rhs.data)

     def __repr__(self):
        return 'MyList(%r)' % self.data

     def __mul__(self, rhs):  # rhs 绑定整数
         print('__mul__被调用')
         return MyList(self.data * rhs)
     def __rmul__(self, lhs):
         print('__rmul__被调用')
         return MyList(self.data * lhs)

 L1 = MyList([1, 2, 3])
 L2 = MyList([4, 5, 6])
 L5 = L1 * 2  # L1.__mul__(2)
 print(L5)  # MyList([1,2,3,1,2,3])

 L6 = 2 * L1  # 2.__mul__(L1)
 print(L6)

五、复合赋值算术运算符的重载

__iadd__(self, rhs)     self += rhs    加法
__isub__(self, rhs)       self -= rhs    减法
__imul__(self, rhs)       self *= rhs    乘法
__itruediv__(self, rhs)   self /= rhs    除法
__ifloordiv__(self, rhs)    self //= rhs   地板除法
__imod__(self, rhs)       self %= rhs    求余
__ipow__(self, rhs)       self **= rhs    冪

class MyList:
    def __init__(self, iterable):
        print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
        self.data = list(iterable)

    def __add__(self, rhs):
        print('__add__被调用')
        return MyList(self.data + rhs.data)

    def __repr__(self):
        return 'MyList(%r)' % self.data

    def __iadd__(self, rhs):
        print("__iadd__被调用!!!!")
        self.data.extend(rhs.data)
        return self

L1 = MyList([1, 2, 3])  # aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
L2 = MyList([4, 5, 6])  # aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
L1 += L2  # 当没有__iadd__方法时,等同于调用L1 = L1 + L2    __iadd__被调用!!!!
print(L1)   # MyList([1, 2, 3, 4, 5, 6])

六、比较运算符的重载

__lt__(self, rhs)   self < rhs      小于
__le__(self, rhs)    self <= rhs    小于等于
__gt__(self, rhs)    self > rhs    大于
__ge__(self, rhs)    self >= rhs    大于等于
__eq__(self, rhs)    self == rhs    等于
__ne__(self, rhs)    self != rhs    不等于

注:比较运算符通常返回True或False

七、位运算符重载

__invert__(self)      ~ self      取反(一元运算符)
__and__(self, rhs)    self &  rhs 位与
__or__(self, rhs)     self |  rhs 位或
__xor__(self, rhs)    self ^  rhs 位异或
__lshift__(self, rhs)    self << rhs 左移
__rshift__(self, rhs)    self >> rhs 右移

八、反向位运算符重载

__rand__(self, lhs)    lhs &  self 位与
__ror__(self, lhs)    lhs |  self 位或
__rxor__(self, lhs)    lhs ^  self 位异或
__rlshift__(self, lhs)    lhs << self 左移
__rrshift__(self, lhs)    lhs >> self 右移

九、复合赋值位运算符重载

__iand__(self, rhs) self &=  rhs 位与
__ior__(self, rhs) self |=  rhs 位或
__ixor__(self, rhs) self ^=  rhs 位异或
__ilshift__(self, rhs) self <<= rhs 左移
__irshift__(self, rhs) self >>= rhs 右移

十、一元运算符的重载

__neg__(self) - self 负号
__pos__(self)  + self 正号
__invert__(self) ~ self 取反

一元运算符的重载方法:

class 类名:
def __xxx__(self):

class MyList:
    def __init__(self, iterable):
        print("__init__被调用")
        self.data = list(iterable)

    def __repr__(self):
        return 'MyList(%r)' % self.data

    def __neg__(self):
        '''此方法用来制定 - self 返回的规则'''
        # L = [-x for x in self.data]
        L = (-x for x in self.data)
        return MyList(L)

L1 = MyList([1, -2, 3, -4])
L2 = -L1
print(L2)

运算符重载说明:

运算符重载不能改变运算符的优先级

Python类名最好用驼峰命名法:

  • MyList MyRange 大驼峰(所有单词首字母大写,其余小写)
  • getStudentAge 小驼峰(第一个单词首字母小写,其它首字母大写)

十一、in / not in 运算符的重载

重载方法:

__contains__(self, e) e in self 成员运算

class MyList:
    def __init__(self, iterable):
        print("__init__被调用")
        self.data = list(iterable)

    def __repr__(self):
        return 'MyList(%r)' % self.data

    def __contains__(self, e):
        '''此方法用来实现 in / not in 运算符的重载'''
        print("__contains__被调用")
        for x in self.data:
            if x == e:
                return True
        return False

L1 = MyList([1, -2, 3, -4])
if -2 in L1:
    print('-2 在 L1 中')
else:
    print('-2 不在 L1中')

# 当MyList的类内重载了__contains__方法,则not in也同时可用
if -3 not in L1:
    print("-3 不在 L1中")
else:
    print('-3 在 L2中')

十二、索引和切片运算符的重载

__getitem__(self, i)     x = self[i] 索引/切片取值
__setitem__(self, i, v)      self[i] = v 索引/切片赋值
__delitem__(self, i)        del self[i] del语句删除索引等

作用:

让自定义的类型的对象能够支持索引和切片操作

class MyList:
    def __init__(self, iterable):
        print("__init__被调用")
        self.data = list(iterable)

    def __repr__(self):
        return 'MyList(%r)' % self.data

    def __getitem__(self, i):
        print("__getitem__被调用, i=", i)
        # if type(i) is not int:
        #     raise TypeError
        return self.data[i]

    def __setitem__(self, i, v):
        print("__setitem__被调用, i=", i, 'v =', v)
        self.data[i] = v  # 修改data绑定的列表

L1 = MyList([1, -2, 3, -4])
v = L1[-1]
print(v)

L1[1] = 2  # 等同于调用 L1.__setitem__(1, 2)
print(L1)

# 以下操作会出错
# print(L1[100000000000])
# print(L1['hello'])

十三、slice 构造函数

作用:用于创建一个Slice切片对象, 此对象存储一个切片的起始值,终止值和步长信息

slice(start, stop=None, step=None) 创建一个切片对象

slice的对象的属性:

  • s.start 切片起始值,默认为None
  • s.stop 切片终止值,默认为None
  • s.step 切片步长 ,默认为None
class MyList:
    def __init__(self, iterable):
        print("__init__被调用")
        self.data = list(iterable)

    def __repr__(self):
        return 'MyList(%r)' % self.data

    def __getitem__(self, i):
        print("__getitem__被调用, i=", i)
        if type(i) is int:
            print("正在做索引操作")
        elif type(i) is slice:
            print("正在做切片操作")
            print("切片的起始值:", i.start)
            print("切片的终止值:", i.stop)
            print("切片的步长:", i.step)
        else:
            raise KeyError
        return self.data[i]

L1 = MyList([1, -2, 3, -4, 5, -6])

print(L1[::2])  # 等同于调用L1[slice(None, None, 2)]

以上就是解析python高级异常和运算符重载的详细内容,更多关于python 高级异常 运算符重载的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python全栈之运算符详解

    目录 1. 算数_比较_赋值_成员 1.1 算数运算符 1.2 比较运算符 1.3 赋值运算符 1.4 成员运算符 2. 身份运算符 小提示: 3. 逻辑运算符 3.1 位运算符 3.2 小总结 4. 代码块_单项_双项分支 4.1 代码块 4.2 流程控制 4.3 单项分支 4.4 双项分支 5. 小作业 总结 1. 算数_比较_赋值_成员 1.1 算数运算符 算数运算符: + - * / // % ** # + var1 = 7 var2 = 90 res = var1 + var2 pri

  • Python学习之运算符号

    目录 1.算数运算符: 2.赋值运算符: 3.比较运算符 4.逻辑运算符 5. 成员运算符 总结 大至分为以下5类运算符号 算数运算符 赋值运算符 比较运算符 逻辑运算符 成员运算符 算数运算符 和 赋值运算符 运算是得到真实的结果 比较运算符 逻辑运算符 和 成员运算符 运算得到的 是布尔值 真True 或 假False 1.算数运算符: +          加          -          减          *          乘          /          除

  • python not运算符的实例用法

    说明 1.not逻辑非,可以对符号右侧的值进行非运算. 2.对于布尔值,非运算会对其进行取反操作,True变False,False变True. 对于非布尔值,非运算会先将其转换为布尔值,然后再取反. 空性值为False,其他为True. 实例 a = True # 如果表达式不赋值.不会对变量a有任何影响, # 只是创建了一个新对象存储了结果, # 同数据类型转换所讲的 not a # 对变量a赋值之后,表达是结果才影响变量a. a = not a print(f"a = {a}")

  • Python中的三目(元)运算符详解

    目录 Python 三元运算符 一.示例 1:使用三元运算符找出两个数字中的最大值. 二.示例 2:根据条件的返回值,Python 执行打印语句之一 三.示例 3:使用嵌套的三元运算符,找到三个数字中的最大值 总结 Python 三元运算符 Python 三元运算符用于根据条件选择两个值之一.它是 if-else 语句的一个缩影,它将两个值之一分配给一个变量. Python 三元运算符的语法是: [statement_1] if [expression] else [statement_2] 如

  • Python开发技巧之海象运算符的三种运用方式

    目录 1. 第一个用法:if/else 2. 第二个用法:while 3. 第三个用法:推导式 Python 版本发展非常快,如今最新的版本已经是 Pyhton 3.9,即便如此,有很多人甚至还停留在 3.6 或者 3.7,连 3.8 还没用上. 很多 Python 3.8 的特性还没来得及了解,就已经成为旧知识了,比如今天要说的海象运算符. 海象运算符是在 PEP 572 被提出的,直到 3.8 版本合入发布. 它的英文原名叫 Assignment Expressions,翻译过来也就是 赋值

  • python基础之基本运算符

    目录 Python基本运算符 算数运算符 比较运算符 逻辑运算符 赋值运算符 总结 Python基本运算符 算数运算符 # + - * / % ** // 算数运算符 # 定义如下运算符 a=7 b=3 print(a+b) print(a-b) print(a*b) print(a/b) print(a%b) print(a//b) # 地板除,相除取整,也可进行复合运算 比较运算符 # == != < > >= <= 比较运算符 a,b=10,5 print(a==b) pri

  • python接口,继承,重载运算符详解

    目录 1. 序列__getitem__ 2. __setitem__ 3. 抽象基类 4. 不要直接子类化内置类型 5. 继承顺序 6. 重载运算符 总结 1. 序列__getitem__ 如果没有 __iter__ 和 __contains__ 方法, Python 会调用 __getitem__ 方法, 设法让 迭代 和 in 运算符可用 class Foo: def __getitem__(self, pos): return range(0, 30, 10)[pos] f = Foo()

  • 解决Python运算符重载的问题

    python进行有理数运算时,希望用运算符(+ - * /)描述计算过程. 只是用来写出更加自然的计算表达式.为此,python为所有算数运算符规定了特殊方法名.其中所有特殊的名字都以两个下划线开始,并以两个下划线结束,即: 当在Python中输入"a+b"时,程序发现使用了"+"运算符,因此就会调用"__add__"方法. 此时,若对自定义类中进行运算符的重载,则可以实现对类的打印.有理数运算等等. 其中,一个问题应当注意,如以下代码 clas

  • 解析python高级异常和运算符重载

    目录 一.高级异常 二.环境管理器 2.1.对象的属性管理函数 三.运算符重载 3.1.算术运算符的重载 四.反向算术运算符的重载 五.复合赋值算术运算符的重载 六.比较运算符的重载 七.位运算符重载 八.反向位运算符重载 九.复合赋值位运算符重载 十.一元运算符的重载 十一.in / not in 运算符的重载 十二.索引和切片运算符的重载 十三.slice 构造函数 一.高级异常 回顾异常相关的语句: try-except:用来捕获异常的通知 try-finally:用来做一定要做的事 re

  • python变量数据类型和运算符

    目录 1 数据类型 1.1 基础类型 1.2 类型判断 2. 运算符和表达式 2.1 算术运算符 2.2 模运算说明 2.3 数学函数 2.4 随机函数 2.5 赋值运算符 2.6 关系运算 2.7 逻辑运算 2.7.1 逻辑与 2.7.2 逻辑或 2.7.3 逻辑非 2.8 短路计算 2.9 注意事项 2.10 身份运算符 2.11 成员运算符 2.12 if-else表达式 1 数据类型 不同类型的变量可以进行的运算是不同的,所以必须理解变量的类型,python中数据类型可以分为: 内置类型

  • C++ 中重载和运算符重载加号实现矩阵相加实例代码

     C++ 重载+运算符重载加号 实现矩阵相加 学习C++ 基础知识,这里实现简单的实例,记录下自己学习生活,很简单,大家一起看看吧! 实例代码: #include<iostream> #include<iomanip> using namespace std; class Complex { private: int i,j,n,a[2][3]; public: Complex(); Complex operator+(Complex &c); void display()

  • python的变量和运算符你都知道多少

    目录 python变量 1. 定义变量 (创建变量) 2.使用变量 3.重新给变量赋值 4. 同时定义多个变量 5.定义变量和重新赋值变量的原理 运算符 1. 数学运算符 2. 比较运算符: 3. 逻辑运算符: 4. 赋值运算符: 5.运算符的优先级 总结 python变量 1. 定义变量 (创建变量) 变量就是一种用来保存数据的容器,使用变量就是使用变量中保存的数据 语法:变量名 = 数据 1.变量名: 要求: 是标识符但不能是关键字 规范: 1. 见名知意(看到变量名就知道变量中保存的是什么

  • python语法 之与用户交互和运算符

    目录 一 程序与用户交互 1.1.什么是与用户交互 1.2.为什么要与用户交互? 1.3.如何与用户交互 1.3.1 输入input: 1.3.2 输出print: 1.3.3 输出之格式化输出 二 基本运算符 2.1 算术运算符 2.2 比较运算符 2.3 赋值运算符 2.4 逻辑运算符 2.4.1 连续多个and 2.4.2 连续多个or 2.4.3 混用and.or.not 2.5 成员运算符 2.6 身份运算符 一 程序与用户交互 1.1.什么是与用户交互 用户交互就是人往计算机中inp

  • Python 高级教程之线程进程和协程的代码解析

    目录 进程 进程 5 种基本状态 进程的特点 进程间数据共享 进程池 进程的缺点 线程 线程的定义 使用线程模块的简单示例 代码解析 协程 协程与线程 Python 协程 协程的执行 关闭协程 链接协程以创建管道 总结 进程 进程是指在系统中正在运行的一个应用程序,是 CPU 的最小工作单元. 进程 5 种基本状态 一个进程至少具有 5 种基本状态:初始态.就绪状态.等待(阻塞)状态.执行状态.终止状态. 初始状态:进程刚被创建,由于其他进程正占有CPU资源,所以得不到执行,只能处于初始状态.

  • Python基础教程之输入输出和运算符

    在我们python中输入输出函数在程序中运用较为广泛,运算符常用于if判断的条件中,今天我来给大家讲解这两项概念. input输入和print输出 input()输入函数 从标准输入设备(一般指键盘)上读取一个字符串,末尾换行符会自动删除 所以我们想输出最后的数据,则需要进行类型转换 input("输入练习") danjia = int(input("请输入每一个多少钱\n")) zhongliang = int(input("请输入购买多少斤\n&quo

  • C#表达式和运算符详细解析

    目录 类型转换 1.表达式 1.2 运算符分类 2.数学运算符 3.赋值运算符 4.关系运算符 5.布尔运算符 6.位运算符 6.1 &按位与运算 6.2 或|按位运算 6.3 异或^按位运算符 6.4按位取反~按位预算符 6.5 左移<<运算符 6.6右移 7.其他运算符 7.1 字符连接运算符+ 7.3 三元运算符 8.运算优先级 总结练习 类型转换 Convert.To类型() 1.表达式 将变量和字面值(在使用运算符时,他们都称作操作数)与运算符组合起来就得到了表达式,它是计算

  • 深入解析Python中的上下文管理器

    1. 上下文管理器是什么? 举个例子,你在写Python代码的时候经常将一系列操作放在一个语句块中: (1)当某条件为真 – 执行这个语句块 (2)当某条件为真 – 循环执行这个语句块 有时候我们需要在当程序在语句块中运行时保持某种状态,并且在离开语句块后结束这种状态. 所以,事实上上下文管理器的任务是 – 代码块执行前准备,代码块执行后收拾. 上下文管理器是在Python2.5加入的功能,它能够让你的代码可读性更强并且错误更少.接下来,让我们来看看该如何使用. 2. 如何使用上下文管理器? 看

  • Python 高级库15 个让新手爱不释手(推荐)

    在本文中,我挑选了15个最有用的软件包,介绍它们的功能和特点 1. Dash Dash 是比较新的软件包,它是用纯 Python 构建数据可视化 app 的理想选择,因此特别适合处理数据的任何人.Dash 是 Flask,Plotly.js 和 React.js 的混合体. 图片 2. Pygame Pygame 是 SDL 多媒体库的 Python 装饰器,SDL(Simple DirectMedia Layer)是一个跨平台开发库,旨在提供对以下内容的低级接口: 音频 键盘 鼠标 游戏杆 基

随机推荐