zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    版本控制-搭建git服务器
    借助阿里AntUI元素实现两个Web页面之间的过渡——“Loading…”
    在VS中自定义代码段
    案例研究:CopyToAsync
    与其他.Net异步模式和类型进行互操作
    使用boilerplate模版创建解决方案
    实践基于Task的异步模式
    实现基于Task的异步模式
    基于Task的异步模式的定义
    基于Task的异步模式--全面介绍
  • 原文地址:https://www.cnblogs.com/yifchan/p/python-1-16.html
Copyright © 2011-2022 走看看