首页 » Python » 基础进阶 » 正文

Python类的继承总结1

1. super()

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

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

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

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

1. 使用父类属性:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018-12-15 16:19
# @Author  : zhdya@zhdya.cn
# @File    : aaaa.py

class Animals(object):
    def __init__(self, name, aggr, hp):
        self.name = 'ZhangAo'
        self.ages = 111
        self.hp = 666

    def eat(self):
        print("{0} now is eating...".format(self.name))

class Dog(Animals):     # 子类继承父类Animal
    def __init__(self, name, ages, hp, kind):
        super().__init__(name, ages, hp)        ##相当于:Animal.__init__(self,name,aggr,hp) 调用父类Animal的相关属性,注意这里super().__init__()中不需要穿self参数
        self.ages = ages        ##如果此处要是传入自己设定的参数,打印的时候自己设定的参数优先级最高
        self.kind = kind        ##也就是输出会使用 ages, kind 这两个参数,其他的会从父类中拿

lucky = Dog('hsq', 1000, 232, 'Nice')

print(lucky.name, lucky.ages, lucky.hp, lucky.kind)

输出:
ZhangAo 1000 666 Nice

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018-12-15 16:19
# @Author  : zhdya@zhdya.cn
# @File    : aaaa.py

class Animals(object):
    def __init__(self, name, aggr, hp):
        self.name = 'ZhangAo'
        self.ages = 111
        self.hp = 666

    def eat(self):
        print("{0} now is eating...".format(self.name))

class Dog(Animals):     # 子类继承父类Animal
    def __init__(self, name, ages, hp, kind):
        # Animal.__init__(self,name,aggr,hp)  # 父类名.__init__(self,初始化方法中其他参数)可以在子类初始化方法中也调用父类初始化方法,获得父类对象的属性
        super().__init__(name, ages, hp)        ##调用父类Animal的相关属性,注意这里super().__init__()中不需要穿self参数
        self.ages = ages        ##派生的属性,如果此处要是传入自己设定的参数,打印的时候自己设定的参数优先级最高
        self.kind = kind        ##也就是输出会使用 ages, kind 这两个参数,其他的会从父类中拿

    def eat(self):
        # Animal.eat(self) # 也是调用父类的eat()方法
        super().eat()   # 这里是调用父类的eat()方法,相当于之前Animal.eat(self)一样的效果,都是子类与父类重名的方法中继续调用父类的重名方法
        print("我虽然是子类中的方法,但我是调用父类的")


lucky = Dog('hsq', 1000, 232, 'Nice')
print(lucky.name, lucky.ages, lucky.hp, lucky.kind) # 除了ageskind其余都是父类的
lucky.eat()     # eat()方法是子类中的方法,但是在这里使用Animal.eat(self)或者 super().eat()方法可以调用父类的方法

##输出:
ZhangAo 1000 666 Nice
ZhangAo now is eating...
我虽然是子类中的方法,但我是调用父类的

其实super()方法 也可以在类外部调用:此时super()应该写成:

super(子类名,子类对象名).父类方法

但绝对不可以去调用父类中的对象属性!!

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018-12-15 16:19
# @Author  : zhdya@zhdya.cn
# @File    : aaaa.py

class Animals(object):
    def __init__(self, name, aggr, hp):
        self.name = 'ZhangAo'
        self.ages = 111
        self.hp = 666

    def eat(self):
        print("{0} now is eating...".format(self.name))

class Dog(Animals):     # 子类继承父类Animal
    def __init__(self, name, ages, hp, kind):
        # Animal.__init__(self,name,aggr,hp)  # 父类名.__init__(self,初始化方法中其他参数)可以在子类初始化方法中也调用父类初始化方法,获得父类对象的属性
        super().__init__(name, ages, hp)        ##调用父类Animal的相关属性,注意这里super().__init__()中不需要穿self参数
        self.ages = ages        ##派生的属性,如果此处要是传入自己设定的参数,打印的时候自己设定的参数优先级最高
        self.kind = kind        ##也就是输出会使用 ages, kind 这两个参数,其他的会从父类中拿

    def eat(self):
        # Animal.eat(self) # 也是调用父类的eat()方法
        super().eat()   # 这里是调用父类的eat()方法,相当于之前Animal.eat(self)一样的效果,都是子类与父类重名的方法中继续调用父类的重名方法
        print("我虽然是子类中的方法,但我是调用父类的")


lucky = Dog('hsq', 1000, 232, 'Nice')
print(lucky.name, lucky.ages, lucky.hp, lucky.kind)     #除了ageskind其余都是父类的
lucky.eat()     # eat()方法是子类中的方法,但是在这里使用Animal.eat(self)或者 super().eat()方法可以调用父类的方法
print("在外部使用super(Dog,lucky)就是调用父类的eat()方法:")
super(Dog,lucky).eat()

##输出:
ZhangAo 1000 666 Nice
ZhangAo now is eating...
我虽然是子类中的方法,但我是调用父类的
在外部使用super(Dog,lucky)就是调用父类的eat()方法:
ZhangAo now is eating...
赞 (1)

发表评论