函数的重写

Posted allwell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的重写相关的知识,希望对你有一定的参考价值。

函数的重写

前提:在具有继承关系的类中

作用:将父类中已有的函数在子类中进行重新的实现【声明部分一样的,实现部分不一样】

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()

 

以上是关于函数的重写的主要内容,如果未能解决你的问题,请参考以下文章

从片段调用 Google Play 游戏服务

调用 .remove(fragment) 后片段未被删除

VSCode自定义代码片段——声明函数

VSCode自定义代码片段8——声明函数

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销

在 Visual Studio 中创建构造函数的代码片段或快捷方式