在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