当前位置:首页 > 编程教程 > Python教程 > python重写与重载

python重写与重载
栏目分类:Python教程发布日期:2020-01-18浏览次数:

重写与重载 首先需要说明的是重写与重载关系不大,仅仅是因为名字相似不易区分,所以本节将他们放在一起讲。 1.重写 程序设计千变万化,我们在使用继承时,很多时候需要修改父类中的某一方法,这时就需要重写这个方法。方法很简单,请看下例: 该例中,第一
重写与重载
首先需要说明的是重写与重载关系不大,仅仅是因为名字相似不易区分,所以本节将他们放在一起讲。

1.重写

程序设计千变万化,我们在使用继承时,很多时候需要修改父类中的某一方法,这时就需要重写这个方法。方法很简单,请看下例:

该例中,第一个person类中仅仅给出了name属性,现在想新写一个student类在继承person类的同时,增加一个age属性,并输出age的值,所以在student类中重写了out()方法,将里面的内容进行了修改,此时在创建一个student对象,调用out()方法,就是我们重写之后的了。
 
再来看下面的一个例子。
我们知道,当一个类没有被手动指定继承类时,它默认继承object类,我们可以使用dir()方法,查看类里的方法和属性。


输出结果:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
运行可以发现,输出的两个类中的方法和属性完全一样,因为他们默认继承了相同的父类。我们重写这里的一个方法’__str__’。
__str__方法默认情况下会返回对象的地址,比如再上述程序中增加语句print(s1),会输出<__main__.person object at 0x0000016098672D08>
此时我们在student类中重写它。

2.重载

当父类方法中的参数不能满足子类需要的时候,使用重载,将参数列表重置。广义(其他变编程语言中)的重载是为了解决两个问题:1.当需求参数类型不同时,重载参数的数据类型;2.当参数个数不同时,重载参数列表。但是在python中,重载显得作用不是很大。
因为,python中一切皆对象,参数可以接受任何类型的数据,对于两个功能相同但要求传入数据类型不同的函数,python完全可以使用相同的代码,没有必要做成两个不同的函数,也不用讲究重载。其次,对于参数个数不一致的问题,python中可以使用容器将多余的参数打包,然后整体传入函数,再解包处理。


上例中,看似是两个参数,实际上应该是将四个数值传入到函数内部。
 
如此说来,在python中重载就没有用吗?
当然不是,我们前面介绍过,python中的“+”运算符,它在连接两个数值(整形和浮点型)时会计算他们的和,但是当连接两个字符串时,功能就变成了将两个字符串拼接,这就是重载应用最强大的一处--运算符重载。
实际上,python的运算符本质是通过调用对象的特殊方法实现的,比如加号运算符对应的方法就是’__add__’,减号运算符对应的是’__sub__’方法,当他们作用于不同类型时,会按照python中设定好的重载方法进行想应得运算,当执行a+b时,实际上是执行了a.__add__(b)这样的操作。
下面我们试试重载加号运算符。                   

输出结果:
小明和小华一共22岁
非同类对象无法相加
 
上例中,利用运算符重载,让我们自定义的person类也可以使用加号运算符进行操作,其中主要是重写了__add__方法,在里面使用isinstance()方法判断传入的对象和person类是否是同种类型或存在继承关系,如果是自定义相加内容,如果不是返回不能相加的提示。假如把这个重写的方法删掉,两个对象是一定不能相加的,
使用类似的方法可以重载下面的各种运算符特殊方法。

运算符 方法 功能
+,- __add__,__sub__ 加法,减法
*,/ __mul__,__truediv__ 乘法,除法
|,^,& __or__,__xor__,__and__ 或,异或,与
<<,>> __lshift__,__rshift__ 左移,友移
** __pow__ 乘方
>,<,= __gt__,__lt__,__eq__ 大于,小于,等于

相关热词: python

下一篇:python多态
     
编程入门 编程教程 编程资源 编程问答