Python面向对象之多态

多态

面向对象三大特性

封装 根据职责将属性和方法封装到一个抽象的类中;–定义类的准则
继承 实现代码的重用,相同的代码不需要重复的编写;–设计类的技巧;子类针对自己的需求,编写特定的代码;
多态 不同的子类对象调用相同的父类方法,产生不同的执行结果;–

  • 多态可以增加代码的灵活度;
  • 以继承和重写父类方法为前提;
  • 是调用方法的技巧,不会影响到类的内部设计;

例如同样是人类,就有医生和教师的工作职别。

多态案例演练

需求:在Dog类中封装方法game,普通狗类只是简单的玩耍;
定义军犬类继承自Dog,重写game方法,军犬可以接飞盘;
定义Person类,并且封装一个和狗玩的方法,在方法内部,直接让狗对象调用game方法。

class Dog(object):
    def __init__(self, name):
        self.name = name

    def game(self):
        print("%s 跳来跳去" % self.name)


class ArmyDog(Dog):
    def game(self):
        print("%s 跑去接飞盘" % self.name)


class Person(object):
    def __init__(self, name):
        self.name = name

    def play_with_dog(self, dog):
        print("%s play with %s" % (self.name, dog.name))
        dog.game()


# bagong = Dog("八公")  # 小明 play with 八公  八公 跳来跳去
bagong = ArmyDog("八公")  # 小明 play with 八公  八公 跑去接飞盘

xiaoming = Person("小明")

xiaoming.play_with_dog(bagong)

Person类中只需要让狗对象调用game方法,而不关心具体是什么狗;game方法是在Dog父类中定义的;
在程序执行时,传入不同的狗对象实参,就会产生不同的执行结果。

多态他解

多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态。

多态,同一个对象,多种形态。python默认支持多态。
多态: 同⼀个对象, 多种形态. 这个在python中其实是很不容易说明⽩的. 因为我们⼀直在⽤. 只是没有具体的说. 比如. 我们创建⼀个变量a = 10 , 我们知道此时a是整数类型. 但是我们可以通过程序让a = “alex”, 这时, a⼜变成了字符串类型. 这是我们都知道的. 但是, 我要告诉你的是. 这个就是多态性. 同⼀个变量a可以是多种形态。

Python伪代码实现Java或C#的多态

class F1(object):
    def show(self):
        print 'F1.show'

class S1(F1):
    def show(self):
        print 'S1.show'

class S2(F1):
    def show(self):
        print 'S2.show'

# 由于在Java或C#中定义函数参数时,必须指定参数的类型
# 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
# 而实际传入的参数是:S1对象和S2对象

def Func(F1 obj):
    """Func函数需要接收一个F1类型或者F1子类的类型"""

    print obj.show()

s1_obj = S1()
Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show

s2_obj = S2()
Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show

Python “鸭子类型”

class F1(object):
    def show(self):
        print 'F1.show'

class S1(F1):

    def show(self):
        print 'S1.show'

class S2(F1):

    def show(self):
        print 'S2.show'

def Func(obj):
    print obj.show()

s1_obj = S1()
Func(s1_obj) 

s2_obj = S2()
Func(s2_obj)
    原文作者:YifChan
    原文地址: https://www.cnblogs.com/yifchan/p/python-1-16.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞