zoukankan      html  css  js  c++  java
  • python之面向对象中的多态

    直接看代码:

    class Dog:
        def __init__(self,name):
            self.name = name
        def play(self):
            print("%s在汪汪汪" % self.name)
    class SonDog(Dog):
        def play(self):
            print("%s不仅会汪,还会飞" % self.name)
    class Person:
        def __init__(self,name):
            self.name = name
        def game(self,dog):
            print("%s正在和%s快乐地做游戏" % (self.name,dog.name))
            dog.play()
    
    wc = Dog("旺财")
    p = Person("妞妞")
    p.game(wc)

    输出:

    说明:SonDog继承了Dog,并重写了play方法 。在Person类中,game方法需要传入一个Dog的实例。

    假设我们传给game的不是Dog类,而是其子类,那么效果又是怎么样的呢?

    # wc = Dog("旺财")
    sonWc = SonDog("旺财儿子")
    p = Person("妞妞")
    p.game(sonWc)

    输出:

    我们发现,调用的是子类的play方法。

    在python中,多态体现得没那么明显。我们可以将其展开来看。python是一门动态语言,不需要指定变量的类型,会在运行阶段自动判别变量的类型。因此,对于某个类而言,在实例化时,不需要指定它是什么类,比如说在java中有Dog这么一个类,在新建它的实例时,都会使用Dog dog = new Dog(),而在python中只需要dog = Dog()。 而所谓的多态,就是父类的引用指向子类的对象,拿java举例:SonDog继承了Dog,在实例化时Dog dog = new SonDog(),这就体现了一种多态性。为什么这么说?设有多个不同的子类继承了该类,那么,该父类的引用指向不同子类的实例,就可以实现不同的功能。这就是多态的思想。

    再拿本段代码而言,在Person类中的game方法,需要传入的是一个Dog对象(python并不用显示的指定它的类型),当传入wc时很好理解,但是,为什么还可以传入sonWc?之前也说过了,可以这么理解:Dog sonWc = new SonDog("旺财儿子"),这不就是父类的引用指向子类的对象了么。子类重写了父类的play方法,在调用时,会调用子类的play方法。

    那么,假设父类中有而子类没有,子类中有而父类中没有的方法会怎么样呢?

    class Dog:
        def __init__(self,name):
            self.name = name
        def play(self):
            print("%s在汪汪汪" % self.name)
        def test1(self):
            print("父类的test1方法")
    class SonDog(Dog):
        def play(self):
            print("%s不仅会汪,还会飞" % self.name)
        def test2(self):
            print("子类的test2方法")
    class Person:
        def __init__(self,name):
            self.name = name
        def game(self,dog):
            print("%s正在和%s快乐地做游戏" % (self.name,dog.name))
            dog.play()
            dog.test1()
            dog.test2()
    
    # wc = Dog("旺财")
    sonWc = SonDog("旺财儿子")
    p = Person("妞妞")
    p.game(sonWc)

    输出:

    假设,我们传入的就是父类的实例:

    wc = Dog("旺财")
    # sonWc = SonDog("旺财儿子")
    p = Person("妞妞")
    p.game(wc)

    输出:

    父类就访问不到子类的特有的方法。

    讲这么一个是为了说明什么,多态使得父类可以访问到子类的方法和属性,虽然在python中并不显得那么明显。

    总结:

    • 本文通过例子讲述了python中的多态:父类的引用指向子类的对象。
    • 另外,像方法的重写和重载也是多态的一种体现。 
  • 相关阅读:
    nginx-1.8.1的安装
    ElasticSearch 在3节点集群的启动
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    sqoop导入导出对mysql再带数据库test能跑通用户自己建立的数据库则不行
    LeetCode 501. Find Mode in Binary Search Tree (找到二叉搜索树的众数)
    LeetCode 437. Path Sum III (路径之和之三)
    LeetCode 404. Sum of Left Leaves (左子叶之和)
    LeetCode 257. Binary Tree Paths (二叉树路径)
    LeetCode Questions List (LeetCode 问题列表)- Java Solutions
    LeetCode 561. Array Partition I (数组分隔之一)
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12144509.html
Copyright © 2011-2022 走看看