python中的运算符重载与模块

在自定数据格式,需要进行算术、逻辑运算时,可以使用运算符重载,即可像原有的数据一样使用数学符号表达式。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__ __iadd__ __radd__的用法

__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 *等方式引入使用。

package/包定义方式

python中的package包是包含多个模块/包的文件夹,包文件夹的定义结构如下

package/ __init__.py file.py file2.py file3.py subpackage/ __init__.py submodule1.py submodule2.py

定义包类文件夹时,每个文件夹下必须包含以__init__.py命名的特殊文件,文件的内容可以为空,包可以采用和模块相同的import方式来使用。

__init__.py文件的作用

__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

你可能感兴趣的:(python知识)