Python面向对象继承案例

面向对象三大特性

  1. 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的  中
  2. 继承 实现代码的重用,相同的代码不需要重复的编写
  3. 多态 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度

01. 单继承

1.1 继承的概念、语法和特点

继承的概念子类 拥有 父类 的所有 方法 和 属性

class Animal:

    def eat(self):
        print("")

    def drink(self):
        print("")

    def run(self):
        print("")

    def sleep(self):
        print("")


class Dog:

    def eat(self):
        print("")

    def drink(self):
        print("")

    def run(self):
        print("")

    def sleep(self):
        print("")

    def bark(self):
        print("汪汪叫")

# 创建一个对象 - 狗对象
wangcai = Dog()

wangcai.eat()
wangcai.drink()
wangcai.run()
wangcai.sleep()
wangcai.bark()
不使用用继承开发动物和狗
1) 继承的语法
class 类名(父类名):

    pass
class Animal:

    def eat(self):
        print("吃---")

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

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

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


class Dog(Animal):

    # 子类拥有父类的所有属性和方法
    # def eat(self):
    #     print("吃")
    #
    # def drink(self):
    #     print("喝")
    #
    # def run(self):
    #     print("跑")
    #
    # def sleep(self):
    #     print("睡")

    def bark(self):
        print("汪汪叫")

# 创建一个对象 - 狗对象
wangcai = Dog()

wangcai.eat()
wangcai.drink()
wangcai.run()
wangcai.sleep()
wangcai.bark()
使用继承开发动物和狗
  • 子类 继承自 父类,可以直接 享受 父类中已经封装好的方法,不需要再次开发
  • 子类 中应该根据 职责,封装 子类特有的属性和方法
2) 专业术语
  • Dog 类是 Animal 类的子类Animal 类是 Dog 类的父类Dog 类从 Animal 类继承
  • Dog 类是 Animal 类的派生类Animal 类是 Dog 类的基类Dog 类从 Animal 类派生
3) 继承的传递性
  • C 类从 B 类继承,B 类又从 A 类继承
  • 那么 C 类就具有 B 类和 A 类的所有属性和方法

子类 拥有 父类 以及 父类的父类 中封装的所有 属性 和 方法

class Animal:

    def eat(self):
        print("吃---")

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

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

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


class Dog(Animal):

    def bark(self):
        print("汪汪叫")


class XiaoTianQuan(Dog):

    def fly(self):
        print("我会飞")


class Cat(Animal):

    def catch(self):
        print("抓老鼠")

# 创建一个哮天犬的对象
xtq = XiaoTianQuan()

xtq.fly()
xtq.bark()
xtq.eat()

xtq.catch()
继承的传递性

提问:哮天犬 能够调用 Cat 类中定义的 catch 方法吗?

答案:不能,因为 哮天犬 和 Cat 之间没有 继承 关系。

1.2 方法的重写

  • 子类 拥有 父类 的所有 方法 和 属性
  • 子类 继承自 父类,可以直接 享受 父类中已经封装好的方法,不需要再次开发

应用场景

  • 当 父类 的方法实现不能满足子类需求时,可以对方法进行 重写(override)

    

重写 父类方法有两种情况:

  1. 覆盖 父类的方法
  2. 对父类方法进行 扩展
1) 覆盖父类的方法
  • 如果在开发中,父类的方法实现 和 子类的方法实现完全不同
  • 就可以使用 覆盖 的方式,在子类中 重新编写 父类的方法实现

  具体的实现方式,就相当于在 子类中 定义了一个 和父类同名的方法并且实现

 重写之后,在运行时,只会调用 子类中重写的方法,而不再会调用 父类封装的方法

class Animal:

    def eat(self):
        print("吃---")

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

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

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


class Dog(Animal):

    def bark(self):
        print("汪汪叫")


class XiaoTianQuan(Dog):

    def fly(self):
        print("我会飞")

    def bark(self):
        print("叫得跟神一样...")


xtq = XiaoTianQuan()

# 如果子类中,重写了父类的方法
# 在使用子类对象调用方法时,会调用子类中重写的方法
xtq.bark()
覆盖父类方法

猜你喜欢

转载自www.cnblogs.com/huiyichanmian/p/11286342.html