1、__sub__()方法 当执行a - b 时,会在 a 的类型中查找__sub__(),然后把 b 作为它的参数。...这很像我写属性访问的文章 里的__getattribute__(),特殊/魔术方法是根据对象的类型来解析的,并不是出于性能目的而解析对象本身;在下面的示例代码中,我使用_mro_getattr() 表示此过程...因此,如果已定义 __sub__(),则 type(a).__sub__(a,b) 会被用来作减法操作。(译注:魔术方法属于对象的类型,不属于对象) 这意味着在本质上,减法只是一个方法调用!...r}" raise TypeError(msg) else: return subtract(lhs, rhs) 2、让右侧使用__rsub__() 但是,如果...在这种情况下,__sub__ 或__rsub__ 能做的就是返回 NotImplemented。 这是给 Python 返回的信号,它应该继续执行下一个操作,尝试使代码正常运行。
它们有各自的特点: 字符串str:存在索引,字符串中的元素是可以重复的,元素是不可变,不能修改的 列表list:也能够进行索引和切片操作,元素可以修改,是可变的 元组tuple:可以看成是不能进行修改的...“列表”;元素不能直接修改,也可以进行索引和切片操作,类似列表 字典:Python中十分常用,键值对组成,键必须是比可变的数据类型(比如元组),值可以是任意数据;字典是无序的 如果说元组是列表和字符串的杂合体...set函数来创建,因为{}是用来创建空字典的 非空集合 使用花括号创建 s2 = {1,2,3,4} s2 {1, 2, 3, 4} type(s2) set 使用set函数创建 s3 = set(...意思是创建的时候存在不可哈希的数据类型:列表 。...reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub
下面就一步一步演示此对象的创建方法,特别要关注双下划线开始和结束的那些特殊方法。...这样就可以使用+运算符了: >>> q1 = Quaternion(1, 2, 3, 4) >>> q2 = Quaternion(0, 1, 3, 5) >>> q1 + q2 Quaternion(...1, 3, 6, 9) 减法 类似地,通过__sub__实现减法运算,不过,这次用一行代码实现。...这里使用了实例对象的__dict__属性,它以字典形式包含了实例的所有属性,请参考《Python大学实用教程》中的详细讲解。 乘法 乘法,如果了解一下线性代数,会感觉有点复杂。...如前所述,四元数的乘法不遵循交换律,但是,如果执行2 * q1这样的操作,按照上面的方式,会报错——在上面的__mul__方法中解决了q1 * 2的运算,而一般我们认为这两个计算是相同的。
index(x[, start[, stop]])#返回 x 在 deque 中的位置(在索引 start 之后,索引 stop 之前)。 返回第一个匹配项,如果未找到则引发 ValueError。...extendleft 4类操作中,若增加元素后超过最大长度,操作不会报错,而是在操作的另一端自动丢弃多余元素(模拟处理"过期"元素);但在insert操作中,由于目标是在deque之间插入,deque无法...from collections import deque dq = deque([1, 2, 3, 4]) dq[0:2]#TypeError: sequence index must be integer...# (copied from class doc) """ 使用defaultdict的最大便利是指定默认类型后,后续操作元素时可以直接操作,无需判断是否存在及初始化。...重点说明下Counter中的两个"减法"操作,一个是subtract,另一个是“-”,即重载的__sub__操作,二者主要区别如下: subtract是实例方法,__sub__是重写的类方法 subtract
下面的对应关系表列出了大部分特殊方法: 方法功能说明__new__()类的静态方法,用于确定是否要创建对象__init__()构造方法,创建对象时自动调用__del__()析构方法,释放对象时自动调用__add__()+__sub...reduce()函数的支持__reversed__()与内置函数reversed()对应__round__()对内置函数round()对应__str__()与内置函数str()对应,要求该方法必须返回str类型的数据...__repr__()打印、转换,要求该方法必须返回str类型的数据__getitem__()按照索引获取值__setitem__()按照索引赋值__delattr__()删除对象的指定属性__getattr...返回该类的所有子类__call__()包含该特殊方法的类的实例可以像函数一样调用__get__()定义了这三个特殊方法中任何一个的类称作描述符(descriptor),描述符对象一般作为其他类的属性来使用...3) >>> t + 5 Traceback (most recent call last): File "", line 1, in t + 5 TypeError
加法的具体实现是__add__,减法的具体实现是__sub__。 具体运算符对应的重载函数可以参考int类中运算符重载的实现:help(int) 不要过度使用运算符重载 Point....会执行 __enter__方法, 执行这个语句块之后,会执行__exit__ 方法,也就是说在这个语句块的前后会执行一些操作,因此也叫上下文。...exception traceback: 上下文管理的应用场景 with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的...,否则如果抛出异常,程序不会执行yield后面的部门,也就是不会执行__exit__部分。...__dict__['x'] # 返回3, 对于属性来说,可以通过 __dict__ 获取 getattr(p, 'print')(3, 5) # 成员方法无法通过__dict__获取,但是可以通过getattr
TypeError:当操作或函数应用于错误类型的对象(例如将字符串添加到整数)时,将引发此异常。NameError:当在当前作用域中找不到变量或函数名称时,将引发此异常。...IndexError:当索引超出列表、元组或其他序列类型的范围时,将引发此异常。KeyError:当在字典中找不到键时,会引发此异常。...ImportError:当 import 语句无法找到或加载模块时,将引发此异常。这些只是 Python 中可能发生的多种异常类型的几个示例。...此错误不会停止程序的执行,但是,它会更改程序的正常流程。...例:TypeError:当操作或函数应用于错误类型的对象时,会引发此异常。下面是一个示例:这里会引发“TypeError”,因为要添加的两种数据类型不同。
type(settwo) >>> settwo {'1'} >>> >>> setthree=set('1') >>> setthree {'1'} #如果我们传递int类型呢..., >>> setthree=set(1) Traceback (most recent call last): File "", line 1, in TypeError...: 'int' object is not iterable #那么int类型如何创建集合呢,用大括号方式q方式去创建就可以 >>> setthree={1,23} >>> setthree {1,...reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub...,这里呢,不全部讲解,大家可以通过dir 和help去研究其他方法的使用。
使用散列表存储数据时,通过一个散列函数将键映射为一个数字,这个数字范围是0到列表长度。散列函数的选择依赖于键的数据类型,在此我们对键的hash值对数组长度区余的方法。散列表的数组究竟应该有多大?...理想情况下,散列函数会将每个键值映射为唯一的数组索引,然而,键的数量是无限的,散列表的长度是有限的,一个理想的目标是让散列函数尽量将键均匀地映射到散列表中。...负载因子是已使用的空间比散列表大小的值。比如,散列表大小为13,已使用空间位8,负载因子位0.62。通常当负载因子超过0.8时,就要新开辟空间并重新散列了。..._keys) idx = abs(hash(key)) % l # 获取空索引 while self....self.union(other) def __and__(self, other): return self.intersection(other) def __sub
返回值:一种与bfloat16类型的x形状相同的张量或稀疏张量或索引切片。...(deprecated)tf.to_complex128( x, name='ToComplex128')警告:不推荐使用此函数。它将在未来的版本中被删除。更新说明:使用tf。演员代替。...(deprecated)tf.to_complex64( x, name='ToComplex64')警告:不推荐使用此函数。它将在未来的版本中被删除。更新说明:使用tf。演员代替。...(deprecated)tf.to_double( x, name='ToDouble')警告:不推荐使用此函数。它将在未来的版本中被删除。更新说明:使用tf。演员代替。...返回值:与int64类型的x形状相同的张量或稀疏张量或索引切片。可能产生的异常:TypeError: If x cannot be cast to the int64.
_ 属性控制 __getattr__ __setattr__ __getitem__ __setitem__ __getattribute__ 数学运算 __add__ __sub...__eq__ __ne__ 容器相关 __len__ __iter__ __contains__ 描述对象 __get__ __set__ __delete__ 可执行...如果继承树可以找到该属性,则不调用此方法 __setattr__ 会拦截所有属性的的赋值语句。如果定义了这个方法,self.arrt = value 就会变成self....应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self....__sub__(per2) def __sub__(self, other): pass # per1 * per2 == > per1.
6.OSError:操作系统产生的异常 7.SyntaxError:语法错误时会抛出此异常 8.TypeError:类型错误,通常是不通类型之间的操作会出现此异常 9....例2:使用多个except捕获异常 #!...AssertionError异常,这时候继教执行下面语句,这时候就出现了TypeError异常,这时候就会执行except TypeError下面的代码块,后面的e代表异常的错误信息,所以这里的结果是打印出异常的错误信息...例3:try与except与else的使用 #!...successful") 上面执行结果为 例4:try与except与else与finally结合使用(可以没有else) #!
print ('i l"o"ve fis.com') 4)条件分支: if condition: 条件为真执行的操作 else: 条件为假执行的操作...a)数值类型:整型、布尔类型、浮点型、e记法(1.5e10) b)类型转换: int()转换为整数 str()转换为字符串 float...test','test1'])-->只能以列表形式添加.末尾添加 insert(): member.insert(1,'牡丹')-->第一位插入牡丹 列表中获取元素:使用索引...__new__(cls,string) 析构方法: __del__(self) 当数据不适用时,调用此方法 只有在调用了该对象的所有实例都消失时才会产生此方法 30)魔法方法:算术运算 __add...__sub__(self,other) def __sub__(self,other): return int.
比如: __init__ : 构造函数,在生成对象时调用 __del__ : 析构函数,释放对象时使用 __repr__ : 打印,转换 __setitem__ : 按照索引赋值 __getitem__...: 按照索引获取值 __len__: 获得长度 __cmp__: 比较运算 __call__: 调用 __add__: 加运算 __sub__: 减运算 __mul__: 乘运算 __div__: 除运算...__del__() 析构方法,当对象在内存中被释放时,自动触发此方法。 注:此方法一般无须自定义,因为 Python 自带内存分配和释放机制,除非你需要在释放的时候指定做一些动作。...__len__() 3 Python 的 list、dict、str 等内置数据类型都实现了该方法,但是你自定义的类要实现len 方法需要好好设计。...Python 的特殊成员和“魔法方法”还有很多,需要大家在平时使用和学习的过程中不断积累和总结使用经验。
例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。 实例化:创建一个类的实例,类的具体对象。...对象可以包含任意数量和类型的数据。...__speak() 出现一个小问题,找了半天,哈哈,逗~ 围观一下:Python构造函数报错:TypeError: People() takes no arguments 注: 1)__init__...类的专有方法(方法名前后均有两个下划线) __init__ : 构造函数,在生成对象时调用 __del__ : 析构函数,释放对象时使用 __repr__ : 打印,转换 __setitem__ : 按照索引赋值...__getitem__: 按照索引获取值 __len__: 获得长度 __cmp__: 比较运算 __call__: 函数调用 __add__: 加运算 __sub__: 减运算 __mul__: 乘运算
+ set1) # 结论,数据类型布偶无法进行加法运算(特指容器类型之间) * 基础数据类型(int float bool)都可以进行乘法运算 容器类型只能和int类型数据进行乘法运算 容器类型进行乘法运算...) # True # 如果使用此方法则不能判断字典 列表 集合 # TypeError: unhashable type: 'list' # print([1,2] in dict1) # not...肯定不行,因为不能使用索引获取数据 # set 可以切片么?...,而是产生一个新的数据序列 # 3.集合和字典无法切片,因为不能使用索引获取数据元素 2、公共函数 len :获取容器内元素个数 del:删除容器内元素 max :获取容器内数据的最大值 min : 获取容器内元素的最小值...('我是func2-----') function2() # 执行顺序,只要函数在调用之前被定义即可,定义函数的顺序不做规定 8、局部变量和全局变量 局部变量就是在函数体内部进行定义函数体外部无法调用的变量
在常见的编译型语言(如C++)中,类在编译的时候就已经确定了,运行时是无法动态创建的。那么Python是如何做到的呢?...__class__) 在Python2中执行结果如下: 在Python3中执行结果如下: ...int(self.value + val) def __radd__(self, val): return int(val + self.value) def __sub...它返回的类型决定了最终创建出来的对象的类型。...0x05 总结 动态创建类必须要使用type实现,但是,根据不同的使用场景,可以选择不同的使用方法。 这样做对静态分析工具其实是不友好的,因为在运行过程中类型发生了变化。
在常见的编译型语言(如C++)中,类在编译的时候就已经确定了,运行时是无法动态创建的。那么Python是如何做到的呢?...__class__) 在Python2中执行结果如下: 在Python3中执行结果如下: ...0x02 使用type动态创建类 type的参数定义如下: type(name, bases, dict) name: 生成的类名 bases: 生成的类基类列表,类型为tuple dict:...self.value + val) def __radd__(self, val): return int(val + self.value) def __sub...0x05 总结 动态创建类必须要使用type实现,但是,根据不同的使用场景,可以选择不同的使用方法。 这样做对静态分析工具其实是不友好的,因为在运行过程中类型发生了变化。
在Python中,可以通过异常处理机制来处理代码执行过程中出现的异常,避免程序崩溃或出现错误结果。...Python中提供了许多内置的异常类型,常见的异常类型包括:NameError当尝试访问一个未定义的变量时,会抛出NameError异常。...a = b + 1 # 抛出NameError异常,b未定义TypeError当函数或操作应用于错误类型的对象时,会抛出TypeError异常。...a = "Hello"b = 2c = a + b # 抛出TypeError异常,无法将字符串和整数相加ValueError当函数或操作应用于具有正确类型但不适合特定值的对象时,会抛出ValueError...a = 1 / 0 # 抛出ZeroDivisionError异常,除数为0IndexError当尝试访问超出列表或元组索引范围的值时,会抛出IndexError异常。
领取专属 10元无门槛券
手把手带您无忧上云