函数的重写
前提:在具有继承关系的类中
作用:将父类中已有的函数在子类中进行重新的实现【声明部分一样的,实现部分不一样】
1.系统函数的重写
注意:并不是所有的函数都需要重写
__str__
__repr__
代码如下:
class Person(object): def __init__(self,name,age,height,score): self.name = name self.age = age self.height = height self.score = score #3.__str__的重写:返回一个对象信息的字符串 def __str__(self): return "name=%s age=%d height=%f score=%d" % (self.name,self.age,self.height,self.score) """ def __repr__(self): return "hello" """ #4.str和repr都和对象有关,让二者的实现返回相同的结果, __repr__ = __str__可以省略 __repr__ = __str__ #等价于下面的写法: """ def __repr__(self): return "name=%s age=%d height=%f score=%d" % (self.name,self.age,self.height,self.score) """ p1 = Person("abc",19,17,37) print(p1.name,p1.score,p1.age,p1.height) #1.如果直接打印对象,获取的是对象的地址 print(p1) #<__main__.Person object at 0x000001C7E4190DD8> p2 = Person("abc",19,17,37) print(p2.name,p2.score,p2.age,p2.height) #2.函数的重写: # __str__:返回一个字符串,但是,如果没有重写该函数,默认返回该对象的地址 #当重写了__str__之后,直接使用对象,则返回的是str函数中的返回值 #print(p1.__str__()) """ 总结: a.当str和repr都未被重写的时候,使用对象,调用的是str,此时的str返回的是对象的地址 b.当str和repr都被重写之后,使用对象,调用的是str,返回的是指定的字符串 c.当没有重写str,但是,重写repr,使用对象,调用的是repr,返回的是指定的字符串 d.当只重写了str,调用是str """ #优点或者使用场景:当一个对象的属性很多,并且都需要通过打印来查看相应的值,就可以重写str函数,简化代码 p3 = Person("abc",19,17,37) print(p3)
2.自定义函数的重写
函数重写的时机:当父类中的函数的功能不满足子类的的需求时,就需要重写
重写的规则;子类中出现和父类中重名的函数,则子类中的会覆盖掉父类中
代码演示:
#父类 class Animal(object): def __init__(self,name): self.name = name def show(self): print("父类~~show") #子类 class Dog(Animal): def __init__(self,name): super().__init__(name) class Cat(Animal): def __init__(self,name): super().__init__(name) class Tiger(Animal): def __init__(self,name): super().__init__(name) #重写父类中的函数 #声明相同,实现不同的 def show(self,num): #调用父类中的函数 super().show() print("子类~~~show") d = Dog("fah") d.show() t = Tiger("abc") t.show(3) #函数名就是一个变量名,重写函数的过程其实就是变量的指向发声改变的过程 #不管子类中的函数有没有参数,和父类的参数列表相不相同,不影响重写,只看函数名 #t.show()