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 不可以!!

 

运行结果:

 

posted @ 2018-09-18 17:33  写的BUG代码少  阅读(361)  评论(0编辑  收藏  举报