Python_多态

1. 多态的基本概念

在我们使用面向对象开发的第一步,要先分析一下职责,根据职责将对象的属性和方法封装到一个抽象的类中,封装是面向对象开发的第一步, 因为要分析对象的职责, 所以我们可以将封装是定义类的一个准则, 我们只有明确了对象的职责, 才能够将一个属性和方法封装到一个抽象的类中, 这个就是第一个特性,封装。

在使用面向对象开发时,继承这个特性,最大的好处就是可以实现代码的重用, 当父类的代码已经开发完成, 我们在设置子类时,就可以让子类继承自父类, 子类继承父类, 就拥有父类的所有属性和方法, 我们在子类中, 针对子类特有的需求, 编写特有的代码,所以我们可以把继承成为设计类的技巧, 父类代码开发完成, 我们在设置子类的时候, 只需要简单的做一个继承, 然后再在子类中针对子类特有的需求进行开发就可以, 这个就是第二个特性, 继承。

不同的子类对象调用相同的父类方法, 产生不同的结果, 要有子类对象,就要使用到继承这个特性。由人类派生出两个类, 一个程序员类, 一个设计师类, 程序员工作产生编写的代码, 而设计师工作,会产生设计作品, 这个就是不同的子类对象调用相同的父类方法work(self), 但是会产生不同的结果。

多态这种方式可以增加代码的灵活度,同时,要使用多态,必须有两个重要的前提, 第一个前提就是继承, 因为我们需要有不同的子类对象,而第二个前提就是子类对象需要重写父类的方法,试想一下, 如果程序员类和设计师都没有针对父类的工作方法进行重写, 那么程序员对象也好, 设计师对象也好, 在调用work(self)方法时, 只会执行父类中封装的方法, 而没有办法表现出自己这个职业特有的工作行为, 而要使用多态,我们必须要在子类对象中重写父类的方法,重写之后,子类对象在调用相同方法时, 会产生不同的结果, 这个就是多态的概念, 多态是调用方法的技巧, 不会影响类的内部设计。

2.案例演练

我们先来定义一个Dog()类, 在Dog()类中封装一个 game() 的方法, 狗要玩, 可以有各种各样的方式, 但是作为父类,并不知道狗应该怎么样玩, 所以我们在父类的game() 方法中, 只是让给做一个简单的玩的动作就可以了, 然后呢,我们在定义一个XiaoTianQuan 类, 让XiaoTianQuan 类继承自Dog() 类, XiaoTianQuan 类作为神犬, 在玩耍的时候, 应该有一些特殊的表现。如果父类的方法不能满足子类的需要, 我们在子类中重写父类的方法, 在重写的方法中, 我们让XiaoTianQuan 类飞到天上去玩耍。

在开发一个Person 类, 在Person 类中, 我们封装一个方法, game_with_dog(self, dog), 然后我们传递一个狗对象作为参数, 在狗的父类中定义了一个game方法, 意味着Dog()类创建的对象,以及Dog()类的所有子类创建的对象, 都 应该有game() 这个方法,所以我们在game_with_dog(self, dog) 直接让传递进来的狗对象调用一下game 方法, 因为只要是Dog()类或者是Dog() 的子类创建的对象, 通通都有game 方法。

首先使用class 关键字来定义一个Dog() 类,并且Dog()继承自object 类, 再使用def 关键字来找到初始化方法, 我们在初始化方法中给狗定义一个name 的属性, 初始化方法准备完成,我们再使用def 关键字来定义一个 game的方法, 并把狗的名字做一个输出,print("%s 蹦蹦跳跳的玩耍..." % self.name)。Dog() 已经定义完成.

再定义一个XiaoTianQuan 类,让XiaoTianQuan 类继承自Dog()类, 现在使用def 关键字,找到父类中的game方法, 我们在XiaoTianQuan 类这个类中针对父类的game()方法进行一个重写, 同时把XiaoTianQuan 类 的name做一个输出, print("%s 飞到天上去玩耍..." % self.name)。

接下来再定义一个Person类, 在Person类中封装一个和狗玩的方法, 仍然使用class 关键字来定义一个Person类, Person 类同样是继承object 这个基类 ,在Person中, 我们先使用def 关键字找到初始化方法,给人也定义一个name的属性, 初始化方法准备完成, 我们再使用def 关键字定义一个 game_with_dog(self) 的方法,并定义一个dog 对象,在方法的内部我们让人和狗玩, 下面第一个%s 是人的名字, 第二个 %s 是狗的名字, print("%s 和 %s 快乐的玩耍..." % (self.name, dog.name)), 再在这个方法内部让狗来玩耍, 只要让dog 调用一下 game()方法就能够玩耍了, dog.game(). 到目前为止,三个类已经开发完成了, 一个Dog类, 一个XiaoTianQuan 类,一个Person(), 紧接着我们在主程序中来做三件事情, 第一件事情,创建一个dog 对象,  先给狗起个名字, 叫wangcai, 然后给Dog() 这个类来创建一个dog对象, 狗的名字叫“旺财”, wangcai = Dog("旺财"),第二件事情, 在创建一个小明对象,在使用Person()类来创建一个xiaoming 对象, 名字叫“小明”, xiaoming = Person(“小明”),  第三件事情, 让小明调用和狗玩的方法, 调用和狗玩的方法,就应该让第一步创建的dog 对象传递到第三步的方法内部,  让xiaoming 来调用game_with_dog()这个方法, 并且把wangcai 作为参数传递进来, xiaoming.game_with_dog(wangcai), 运行一下程序, 控制台输出了“小明和旺财快乐的玩耍” 和“旺财 蹦蹦跳跳的玩耍”,这是使用wangcai = Dog("旺财")为狗对象的执行结果, 当将wangcai = Dog("旺财")替换成XiaoTianQuan 类(也就是Dog 的子类)来创建一个同样叫wangcai 的狗, wangcai = XiaoTianQuan("飞天旺财"),并没有调整类的代码, 也没有下面出来人对象以及任何狗玩的方法的代码,运行一下程序, 控制台输出了“小明 和 飞天旺财 快乐的玩耍...” 和“飞天旺财 飞到天上去玩耍...”,飞到天上去玩耍是XiaoTianQuan类中封装的方法。前后两个不同的狗,在玩耍的时候, 我们只需要把创建狗对象的代码做一个修改,而Person 类中的代码我们没有改动过。

#在程序执行时,传入不同的狗对象, 就会产生不同的执行效果,这个就叫做多态。


# 定义一个狗类
class Dog(object):

    def __init__(self, name):
        self.name = name
    # 初始化方法定义完成

    def game(self):
        print("%s 蹦蹦跳跳的玩耍..." % self.name)


# 定义一个 哮天犬类
class XiaoTianDog(Dog):

    def game(self):
        # 可以直接使用父类Dog 中定义的name 属性
        print("%s 飞到天上去玩耍..." % self.name)


# 定义一个Person 类
class Person(object):

    def __init__(self, name):
        self.name = name 

    # 在这个方法的参数中, 我们要传入一个dog 对象
    def game_with_dog(self, dog):

        # 在方法的内部, 让人和狗玩, 传入人和狗的名字
        print("%s 和 %s 快乐的玩耍..." % (self.name, dog.name))

        #让狗玩耍, 调用Dog 类中封装的game()方法就可以完成了
        dog.game()


# 1. 创建一个狗对象
# wangcai = Dog("旺财")
wangcai = XiaoTianDog("飞天旺财")

# 2. 创建一个小明对象
xiaoming = Person("小明")

# 3. 让小明调用和狗玩的方法, 把狗对象传递进来
xiaoming.game_with_dog(wangcai)


    

执行结果:

在程序执行时,传入不同的狗对象, 就会产生不同的执行效果,这个就叫做多态。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值