在自定数据格式,需要进行算术、逻辑运算时,可以使用运算符重载,即可像原有的数据一样使用数学符号表达式。python中的运算符重载是通过重载特殊的系统方法来实现的,文档中称为special methods,函数本身一般一双下划线开头和结尾。
自定义一个类似复数的数据格式,在没有重载__add__的情况下
#!/usr/bin/python
class MyDemoClass:
def __init__(self,inputI,inputQ):
self.Ivalue = inputI
self.Qvalue = inputQ
pass
def __del__(self):
pass
if __name__ == '__main__':
a = MyDemoClass(10,20)
b = MyDemoClass(20,30)
c = a + b
print(c.Ivalue)
print(c.Qvalue)
pass
运行脚本得到的结果
Traceback (most recent call last):
File "test.py", line 21, in
c = a + b
TypeError: unsupported operand type(s) for +: 'MyDemoClass' and 'MyDemoClass'
重载__add__函数之后
#!/usr/bin/python
class MyDemoClass:
def __init__(self,inputI,inputQ):
self.Ivalue = inputI
self.Qvalue = inputQ
pass
def __del__(self):
pass
def __add__(self,another):
tmpIvalue = self.Ivalue + another.Ivalue
tmpQvalue = self.Qvalue + another.Qvalue
return MyDemoClass(tmpIvalue,tmpQvalue)
pass
if __name__ == '__main__':
a = MyDemoClass(10,20)
b = MyDemoClass(20,30)
c = a + b
print(c.Ivalue)
print(c.Qvalue)
pass
再次运行得到的结果:
30
50
__add__重载的是加法运算,表示的是 c = a + b;__iadd__重载的是+=运算,表示 a += b;__radd__表示c=a+b情况下,如果a类型没有定义相应的加法运算,即没有重载__add__函数,则如果类型b中定义了__radd_,则使用b中重载的__radd__函数进行加法运算。
算术运算: 加法 + __add__;减法 - __sub__;乘法 * __mul__;除法 /与//,其中/对应 __truediv__,//对应 __floordiv__,差别例如在于整数相除时,得到浮点数还是取整数;指数运算 ** __pow__;求余数 % __mod__;绝对值 abs __abs__; a @ b 矩阵matmult __matmult__;正号 +a形式 __pos__;负号 -a __neg__;
按位运算: 左移位 << __lshift__; 右移位 >> __rshift__; 按位与 & __and__;按位或 | __or__;按位异或 ^ __xor__;非 ~ __invert__;
逻辑比较: 小于 < __lt__; 小于等于 <= __le__; 等于 == __eq__; 不等 != __ne__;大于 > __gt__;大于等于 >= __ge__;not __not__; is not is_not; in contians __contains__;
其它: __str__格式string格式,用于print打印;
https://docs.python.org/3/library/operator.html#module-operator
https://www.programiz.com/python-programming/operator-overloading
https://docs.python.org/3/reference/datamodel.html#special-method-names
https://infohost.nmt.edu/tcc/help/pubs/python/web/special-methods.html
https://infohost.nmt.edu/tcc/help/pubs/python/web/index.html
https://docs.python.org/3/reference/index.html
https://docs.python.org/3/genindex-_.html
python的模块划分类似于传统意义上的文件包含,每个python的文件都可以作为一个模块,使用方法例如存在一个文件a.py,在其它文件中可以通过import a或from a import *等方式引入使用。
python中的package包是包含多个模块/包的文件夹,包文件夹的定义结构如下
package/ __init__.py file.py file2.py file3.py subpackage/ __init__.py submodule1.py submodule2.py
定义包类文件夹时,每个文件夹下必须包含以__init__.py命名的特殊文件,文件的内容可以为空,包可以采用和模块相同的import方式来使用。
__init__.py主要用于指示文件夹为python的包,可以在其中进行一些配置,方便使用。
可以通过在__init__.py中修改__all__ = ["module1","module2"]的方式来定义包导出的模块。当定义了__all__时,使用from subpackage import *的方式导入module1、module2。
可以在__init__.py 通过from module import name的方式来简化使用,在未定义时,需要采用from package.module import name的方式,而修改__init__.py后可以直接使用from package import name的形式。
python package http://mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html