【Python基础知识库】Python中重载

    技术2025-12-05  7

    参考python 中的重载

    在Python中,具有重载的思想却没有重载的概念。实际上,Python编程中具有重载的目的却无重载的行为,或者说python并不需要重载。python是一门动态语言,不需要声明变量类型,函数中可以接受任何类型的参数也就无法根据参数类型来支持重载,python没有必要去考虑参数的类型问题,这些都可以在函数内部判断处理,并无必要去在写一个函数。python 有多种传参方式,默认参数、可变参数、可变关键字参数,可以处理函数参数中参数可变的问题。

    # python3.4 中提供的一个转发机制来实现重载 from functools import singledispatch @singledispatch # 只支持根据第一个参数的类型来重载,不支持多参数重载 def function(obj): # 被重载的函数 print('%r' % (obj)) @function.register(int) def function_int(obj): print('Integer: %d' % (obj)) @function.register(str) def function_str(obj): print('String: %s' % (obj)) @function.register(list) def function_list(obj): print('List: %r' % (obj)) if __name__ == '__main__': function(1) function('hello') function(range(3)) function(object) # 结果 ''' Integer: 1 String: hello range(0, 3) <class 'object'> '''

    重载是对继承的父类方法进行重新定义,重载可以重新定义方法还可以重新定义运算符。因为通过继承的类不一定能满足当前类的需求,在当前类中只需要修改部分内容而达到自己的需求。

    重载的特点: - 减少代码量和灵活指定型类 - 子类具有父类的方法和属性 - 子类不能继承父类的私有方法或属性 - 子类可以添加新的方法 - 子类可以修改父类的方法

    # 方法重载 class Human(object): __name = '' # 定义属性 __sex = 0 __age = 0 __height = 0 __weight = 0 def __init__(self, sex, age, height, weight): self.__sex = sex self.__age = age self.__height = height self.__weight = weight def set_name(self, name): self.__name = name def show(self): print(self.__name, self.__sex, self.__age, self.__height, self.__weight) class Student(Human): __classes = 0 __grade = 0 __num = 0 def __init__(self, classes, grade, num, sex, age, height, weight): # 重载 __init__方法 self.__classes = classes self.__grade = grade self.__num = num Human.__init__(self, sex, age, height, weight) def show(self): # 重载 show 方法 Human.show(self) print(self.__classes, self.__grade, self.__num) if __name__ == '__main__': s = Student(3, 2, 19990520, '男', 20, '172', 55) s.set_name('小明') s.show() # 结果 ''' 小明 男 20 172 55 3 2 19990520 '''

    运算符重载是在类方法中拦截内置的操作——当类的实例出现在内置操作中,Python自动调用重新定义的方法,并将重新定义方法的返回值变成了相应操作的结果。

    python对运算符重载的一些限制:

    不能重载内置类型的运算符不能新建运算符,只能重载现有的某些运算符不是重载:is、and、or、not

    Python中运算符重载 《流畅的python》

    # 运算符重载 class List(object): __list = [] def __init__(self, *args): # 重载 __init__ 方法 self.__list = [] for arg in args: self.__list.append(arg) def __add__(self, n): # 重载加法"+"运算符 for i in range(0, len(self.__list)): self.__list[i] +=n def __sub__(self, n): # 重载减法"-"运算符 for i in range(0, len(self.__list)): self.__list[i] -= n def __mul__(self, n): # 重载乘法"*"运算符 for i in range(0, len(self.__list)): self.__list[i] *= n def __turediv__(self, n): # 重载除法"/"运算符 for i in range(0, len(self.__list)): self.__list[i] /= n def __floordiv__(self, n): # 重载整除"//"运算符 for i in range(0, len(self.__list)): self.__list[i] //= n def __mod__(self, n): # 重载求余"%"运算符 for i in range(0, len(self.__list)): self.__list[i] %= n def __pow__(self, n): # 重载次幂"**"运算符 for i in range(0, len(self.__list)): self.__list[i] **= n def show(self): print(self.__list) if __name__ == '__main__': data_list = List(1, 2, 3, 4, 5, 6, 7, 8, 9) data_list.show() data_list + 2 data_list.show() data_list - 2 data_list.show() data_list * 2 data_list.show() # data_list / 2 # data_list.show() data_list // 2 data_list.show() data_list % 2 data_list.show() data_list ** 2 data_list.show() # 结果 ''' [1, 2, 3, 4, 5, 6, 7, 8, 9] [3, 4, 5, 6, 7, 8, 9, 10, 11] [1, 2, 3, 4, 5, 6, 7, 8, 9] [2, 4, 6, 8, 10, 12, 14, 16, 18] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 0, 1, 0, 1, 0, 1, 0, 1] [1, 0, 1, 0, 1, 0, 1, 0, 1] '''

    一元运算符重载:

    名称运算符方法取正+__pos__取负-__neg__按位取反~__invert__取绝对值| |__abs__

    常见的算术运算符重载:

    名称运算符正向方法反向方法就地方法加法+__add____radd____iadd__减法-__sub____rsub____isub__乘法*__mul____rmul____imul__除法/__truediv____rtruediv____itruediv__整除//__floordiv____rfloordiv____ifloordiv__求余%__mod____rmod____imod__次幂**__pow____rpow____ipow__

    位操作运算符重载:

    名称运算符正向方法反向方法就地方法位与&__and____rand____iand__位或|__or____ror____ior__位异或^__xor____rxor____ixor__左移<<__lshift____rlshift____ilshift__右移>>__rshift____rrshift____irshift__

    比较运算符重载:

    名称运算符正向方法反向方法后备机制相等a == ba.__eq__(b)b.__eq__(a)返回id(a) == id(b)不相等a != ba.__ne__(b)b.__ne__(a)返回not (a == b)大于a > ba.__gt__(b)b.__gt__(a)抛出TypeError大于等于a >= ba.__ge__(b)b.__ge__(a)抛出TypeError小于a < ba.__lt__(b)b.__lt__(a)抛出TypeError小于等于a <= ba.__le__(b)b.__le__(a)抛出TypeError

    内建函数重载:

    def __len__(self): return len(obj) def __reversed__(self): return reversed(obj) def __round__(self): return round(obj)

    数值转换函数重载:

    def __int__(self): return int(obj) def __float__(self): return float(obj) def __complex__(self): return complex(obj) def __bool__(self): return bool(obj)

    成员资格函数in、not in运算符重载

    def __contains__(self, e)

    索引和切片运算符重载

    __getitrm__(self, i)方法 __setitrm__(self, i, v)方法 __delitrm__(self, i)方法

    class Indexer(object): def __getitem__(self, index): return index ** 2 x = Indexer() print(x[2]) # 结果 ''' 4 '''

    迭代对象重载:

    __next__(self) 迭代器 __iter__(self)可迭代对象

    with环境管理器类内重载:

    __enter__ 方法将在进入 with 语句时被调用返回由 as 变量管理的对象。 __exit__ 方法将在离开with语句时被调用,且可以用参数来判断离开with语句时是否有异常发生并作出相应的处理。

    属性相关方法重载

    __getattr__属性获取 __setattr__属性赋值 __delattr__属性删除

    其他

    方法重载说明__init__构造函数对象创建: X = Class(args)__new__创建在__init__之前创建对象__call__函数调用X(*args, **kwargs)__repr__, __str__打印,转换print(X),repr(X),str(X)__del__析构函数对X对象收回
    Processed: 0.016, SQL: 9