面向对象三大特性

  • 1.封装:就像把宝贝放进一个箱子里一样,我们把属性和方法都装进一个抽象的类中,以保护它们的隐私。这样,我们就可以根据职责来管理它们了。

    • 定义类的准则:就像给宝贝起个名字一样,我们要给类一个有意义的名字,让它能够清楚地表达它的职责。

  • 2.继承:就像是家族中的传承一样,我们可以让子类继承父类的属性和方法,这样就不用重复编写相同的代码了。

    • 设计类的技巧:就像是给家族成员起名字一样,我们要根据他们的特点来设计类,让每个类都能够满足自己特有的需求。

    • 子类针对自己特有的需求,编写特定的代码:就像是家族成员有自己的个性一样,子类可以根据自己的需求来编写特定的代码,让自己与众不同。

  • 3.多态:就像是变色龙一样,不同的子类对象调用相同的父类方法,会产生不同的执行结果。

    • 多态可以增加代码的灵活度:就像是变色龙可以变换颜色一样,多态可以让我们的代码更加灵活,适应不同的情况。

    • 以继承和重写父类方法为前提:就像是变色龙需要有变色的能力一样,多态需要我们在子类中重写父类的方法,才能发挥作用。

    • 是调用方法的技巧,不会影响到类的内部设计:就像是变色龙的变色不会改变它的内部结构一样,多态只是一种调用方法的技巧,不会对类的内部设计产生影响。

多态案例演练

需求

  1. Dog 类中封装方法 game(),普通狗只是简单的玩耍。

  2. 定义 XiaoTianDog 继承自 Dog,并且重写 game() 方法,哮天犬需要在天上玩耍。

  3. 定义 Person 类,并且封装一个 play_with_dog() 方法,在方法内部,直接让狗对象调用 game() 方法。

class Dog:
    def game(self):
        """
        普通狗的游戏方式
        """
        print("普通狗正在玩耍")

class XiaoTianDog(Dog):
    def game(self):
        """
        哮天犬的游戏方式
        """
        print("哮天犬正在天上玩耍")

class Person:
    def play_with_dog(self, dog):
        """
        与狗玩耍的方法
        """
        dog.game()

# 创建狗对象
dog = Dog()
xiao_tian_dog = XiaoTianDog()

# 创建人对象
person = Person()

# 与普通狗玩耍
person.play_with_dog(dog)  # 输出:普通狗正在玩耍

# 与哮天犬玩耍
person.play_with_dog(xiao_tian_dog)  # 输出:哮天犬正在天上玩耍

在上述代码中,我们定义了一个 Dog 类,其中封装了一个 game() 方法,用于普通狗的玩耍方式。然后,我们定义了一个 XiaoTianDog 类,继承自 Dog 类,并重写了 game() 方法,用于哮天犬在天上玩耍的方式。

接下来,我们定义了一个 Person 类,其中封装了一个 play_with_dog() 方法。在该方法内部,我们直接调用了狗对象的 game() 方法,实现了与狗玩耍的功能。

最后,我们创建了一个普通狗对象和一个哮天犬对象,并创建了一个人对象。通过调用人对象的 play_with_dog() 方法,我们可以与普通狗和哮天犬进行玩耍,并分别输出它们的游戏方式。

案例小结

  • Person 类中,我们只需要让狗对象调用 game 方法,而不需要关心具体是什么狗。

    • game 方法是在 Dog 父类中定义的。

  • 在程序执行时,传入不同的狗对象实参,就会产生不同的执行效果。

多态的好处在于它能够更容易编写通用的代码,以适应需求的不断变化!这意味着我们可以使用相同的代码来处理不同类型的对象,而不需要为每种类型编写单独的代码。这样一来,我们的代码会更加灵活和可扩展。在这个案例中,我们可以轻松地添加新的狗类,而不需要修改 Person 类的代码。这就是多态的魅力所在!