Python基础篇(11):面向对象之继承(继承与重写)

一、单继承

1、单继承语法

class 类名(父类名):
    初始化语句1
    初始化语句2
    ...

2、单继承案例

class Animal:
    # 动物的特性
    def eat(self):
        print("吃")

    def drink(self):
        print("喝")

    def run(self):
        print("跑")

    def sleep(self):
        print("睡")


class Dog(Animal):
    def dark(self):
        print("汪汪叫")


dog = Dog()
dog.sleep()     # 睡
dog.dark()      # 汪汪叫

二、多继承

1、多继承语法

# 多继承语法
class A:
    ...


class B:
    ...

...


class C(A, B, ...):
    ...

 2、多继承案例

# 多继承语法
class A:
    def test(self):
        print("test")


class B:
    def demo(self):
        print("demo")


class C(A, B):
    pass    # 没想好函数内容时可以使用,使用占位符防止空函数报错


c = C()
c.test()   # test
c.demo()   # demo

3、多继承注意事项

多继承中,如果类A和类B有同样的方法,尽量避免使用多继承,因为A和B谁的顺序在前,会使用谁的方法

三、继承中的特点

  • 如果子类需要父类的构造方法,只能显式调用父类的构造方法,或者不重写父类的构造方法
  • 子类继承父类,可以直接享受父类已封装好的方法
  • 子类中应该根据职责,封装子类特有的属性和方法
  • 先在本类中查找调用的方法,找不到才去父类中找

1、子类不重写父类的__init__,实例化子类,会自动调用父类的__init__

# 子类不重写父类的构造方法
class Father:
    def __init__(self, name):
        self.name = name
        print("name: %s" % self.name)

    def getName(self):
        return "Father %s" % self.name


class Son(Father):
    # 子类重写父类的getName方法
    def getName(self):
        return "Son %s" % self.name


son = Son("runoob")   # init方法创建对象自动调用,所以会打印name: runoob
print(son.getName())  # Son runoob

2、子类重写父类的__init__,实例化子类,会自动调用子类的__init__

# 子类重写父类的构造方法
class Father:
    def __init__(self, name):
        self.name = name
        print("name: %s" % self.name)

    def getName(self):
        return "Father %s" % self.name


class Son(Father):
    # 子类重写父类的构造方法
    def __init__(self, name):  # 提示 Call to __init__ of super class is missed
        self.name = name
        print("hi")

    # 子类重写父类的getName方法
    def getName(self):
        return "Son %s" % self.name


son = Son("runoob")   # 子类重写父类的构造方法,打印hi
print(son.getName())  # Son runoob

3、如果重写了__init__ 时,使用 super 关键字继承父类的构造方法

# 子类重写父类的构造方法
class Father:
    def __init__(self, name):
        self.name = name
        print("name: %s" % self.name)

    def getName(self):
        return "Father %s" % self.name


class Son(Father):
    # 子类重写父类的构造方法
    def __init__(self, name):
        # 使用super继承父类构造方法
        super().__init__(name)
        self.name = name
        print("hi")

    # 子类重写父类的getName方法
    def getName(self):
        return "Son %s" % self.name


son = Son("runoob")   # 继承父类的构造方法,打印name: runoob    hi
print(son.getName())  # Son runoob

4、子类重写父类普通方法,使用 super 关键字继承父类的方法

# 子类重写父类的构造方法
class Father:
    def __init__(self, name):
        # 创建实例属性
        self.name = name
        print("name: %s" % self.name)

    def getName(self):
        # return "Father %s" % self.name
        print("父类方法")


class Son(Father):
    # 子类重写父类的构造方法
    def __init__(self, name):
        # 使用super继承父类构造方法
        super().__init__(name)
        # 创建实例属性
        self.name = name
        print("hi")

    # 子类重写父类的getName
    def getName(self):
        # 子类方法实现包含父类方法 使用super().父类方法
        super().getName()
        return "Son %s" % self.name


son = Son("runoob")  # 继承父类的构造方法,打印name: runoob    hi
print(son.getName())  # 父类方法    Son runoob

疑问:下面这段代码为什么父类中的getName没输出???

# 子类重写父类的构造方法
class Father:
    def __init__(self, name):
        self.name = name
        print("name: %s" % self.name)

    def getName(self):
        return "Father %s" % self.name
        # print("父类方法")


class Son(Father):
    # 子类重写父类的构造方法
    def __init__(self, name):
        # 使用super继承父类构造方法
        super().__init__(name)
        self.name = name
        print("hi")

    # 子类重写父类的getName
    def getSonName(self):
        # 子类方法实现包含父类方法 使用super().父类方法
        super().getName()
        return "Son %s" % self.name


son = Son("runoob")  # 继承父类的构造方法,打印name: runoob    hi
print(son.getSonName())  # 为什么父类中的getName没输出???

问题原因是:在子类的 getSonName() 方法中没有将父类的 getName() 方法的输出打印出来。需要在子类的 getSonName() 方法中将super().getName()修改为 print(super().getName()) 来输出父类的 getName() 方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值