zoukankan      html  css  js  c++  java
  • python学习笔记 day24 单继承中使用super()

    1. super()

    实例化一个类时,就会自动创建一个self对象,然后会调用__init__()初始化方法,执行初始化方法,给self添加属性以及对应的属性值,执行完之后就把self对象返回给实例化的对象;

    当一个类有初始化方法,但是仍然需要继承父类的属性,我们可以在子类的__init__()初始化方法中采用父类名.__init__(self,父类初始化方法中其他参数(也就是子类要继承的这些属性)) 这里的self对象表示子类实例化的对象,是一定要传的!

    当一个类具有和父类一样的方法名,但是需要在子类对应的方法中仍然使用父类的重名方法,也就是进行扩充功能,我们可以在子类对应的方法中使用父类名.方法名(self) 来调用父类的重名方法,并且self参数依然不能省略;

    上面说的两种情况其实还可以使用super()进行实现 子类继承父类属性,子类方法名和父类重名,仍需使用父类方法时:

    1. 使用父类属性:

    class Animal():
        def __init__(self,name,aggr,hp):
            self.name=name
            self.aggr = aggr
            self.hp=hp
        def eat(self):
            print("%s正在吃..."%self.name)
    
    class Dog(Animal):  # 子类继承父类Animal
        def __init__(self,name,aggr,hp,kind):
            super().__init__(name,aggr,hp)  # 相当于:Animal.__init__(self,name,aggr,hp) 这里就可以在子类中调用父类Animal的相关属性,注意这里super().__init__()中不需要穿self参数,
                                            # 因为super()里面其实是super(Dog,self)已经传过了
            self.kind=kind
    
    lucky=Dog('lucky',20,100,'哈士奇')
    print(lucky.name)

    运行结果:

    2. 子类中有重名方法仍使用父类方法:

    class Animal():
        def __init__(self,name,aggr,hp):
            self.name=name
            self.aggr=aggr
            self.hp=hp
        def eat(self):
            print("%s正在吃"%self.name)
    
    class Dog(Animal):
        def __init__(self,name,aggr,hp,kind):
            # Animal.__init__(self,name,aggr,hp)  # 父类名.__init__(self,初始化方法中其他参数)可以在子类初始化方法中也调用父类初始化方法,获得父类对象的属性
            super().__init__(name,aggr,hp)  # super().__init__(父类初始化方法中的其他参数,除了self),这里self参数是不需要传的;
                                            # 因为super().__init__()中的super()相当于super(Dog,self)
            self.kind=kind  # 派生属性
        def eat(self):
            # Animal.eat(self) # 也是调用父类的eat()方法
            super().eat()  # 这里是调用父类的eat()方法,相当于之前Animal.eat(self)一样的效果,都是子类与父类重名的方法中继续调用父类的重名方法
            print("我是子类中的eat()方法")
    
    lucky=Dog('lucky',20,1000,'哈士奇')
    print(lucky.name)   # name属性是从父类中调用的
    lucky.eat()  # eat()方法是子类中的方法,但是在这里使用Animal.eat(self)或者 super().eat()方法可以调用父类的方法

    运行结果:

     其实super()方法 也可以在类外部调用:此时super()应该写成super(子类名,子类对象名).父类方法  注意这时候只可以使用super(子类名,子类对象名)去调用父类中的方法,绝对不可以去调用父类中的对象属性!!

    因为本来类名就不可以调用对象属性,之可以调用方法~

    class Animal():
        def __init__(self,name,aggr,hp):
            self.name=name
            self.aggr=aggr
            self.hp=hp
        def eat(self):
            print("这是父类的eat()方法: %s正在吃"%self.name)
    
    class Dog(Animal):
        def __init__(self,name,aggr,hp,kind):
            # Animal.__init__(self,name,aggr,hp)  # 父类名.__init__(self,初始化方法中其他参数)可以在子类初始化方法中也调用父类初始化方法,获得父类对象的属性
            super().__init__(name,aggr,hp)  # super().__init__(父类初始化方法中的其他参数,除了self),这里self参数是不需要传的;
                                            # 因为super().__init__()中的super()相当于super(Dog,self)
            self.kind=kind  # 派生属性
        def eat(self):
            # Animal.eat(self) # 也是调用父类的eat()方法
            # super().eat()  # 这里是调用父类的eat()方法,相当于之前Animal.eat(self)一样的效果,都是子类与父类重名的方法中继续调用父类的重名方法
            print("我是子类中的eat()方法")
    
    lucky=Dog('lucky',20,1000,'哈士奇')
    print(lucky.name)   # name属性是从父类中调用的
    print("调用子类的eat()方法:")
    lucky.eat()  # 这里就是调用子类的eat()方法
    print("在外部使用super(Dog,lucky)就是调用父类的eat()方法:")
    super(Dog,lucky).eat()

    运行结果:

    但是我们是不可以在外部使用super(Dog,luck).name来调用name属性(之前就说过类名是不可以调用对象的属性的

    lucky=Dog('lucky',20,1000,'哈士奇')
    print(super(Dog,lucky).name)  # 错误的!! 企图使用super(子类名,子类对象名)其实也就是父类Animal调用父类中的对象属性name 不可以!!

    运行结果:

    talk is cheap,show me the code
  • 相关阅读:
    IB(InterBase Server) 的完整连接格式
    jna
    编写基于Prototype的Javascript动画类
    Go——使用 go mod ——有依赖的Go工程
    pkgconfig—— PKG_CONFIG_PATH——Makefile——pkgconfig的作用与使用
    Go——Goland Debug报错Version of Delve is too old for this version of Go
    NATS——NATS Streaming 是什么 (转)
    Go——Go语言调用C语言
    go get安装包超时处理
    NATS—基础介绍 (转自 https://www.cnblogs.com/yorkyang/p/8392172.html)
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9670250.html
Copyright © 2011-2022 走看看