面向对象三大特性之多态

摘要:
面向对象的三个特性中的多态性是什么?不同的对象对同一方法的不同行为作出响应,并产生不同的结果。使用基类创建一组统一的规则来强制子类遵循(使用抽象类来实现),这样就可以直接使用对象下的方法,而不必考虑对象的特定类型。为什么你有多态性?这增加了程序响应更改的灵活性。无论对象如何变化,用户都以相同的形式调用。例如,func(animal)改进了程序的可扩展性,并通过继承animal类创建了一个新类。用户无需更改

面向对象三大特性之多态

  • 什么是多态

    不同对象响应同一种方法的表现出不同的行为,产生不同的结果

    用基类创建一套统一的规则,强制子类去遵循(使用抽象类实现),这样便可以在不用考虑对象具体类型的前提下而直接使用对象下的方法

  • 为什么要有多态

    1. 增加了程序的灵活性

      以不变应万变,不论对象千变万化,使用者都是以同一种形式去调用,如func(animal)

    2. 提高程序的拓展性

      通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用  

  • 怎么用多态

    让几个不同的类拥有相同的父类,继承了相同的方法,然后重新定义其方法,这样用相同的方法就能产生不同的结果.

class Animal:
    def eat(self):
        print('动物在吃草')
​
​
class Person(Animal):
    def eat(self):  # 定义人的方法
        print('人吃粮食...')
​
​
class Pig(Animal):
    def eat(self):  # 定义猪的方法
        print('猪吃饲料...')
​
​
class Dog(Animal):
    def eat(self):  #定义狗的方法
        print('狗吃骨头...')
​
# 产生对象
person = Person()
pig = Pig()
dog = Dog()
​
​
# 调用不同对象的同一方法,产生不同结果(多态性的体现)
peo.talk()
dog.talk()
pig.talk()
​
​
def func(animal):  # 可以进一步封装成一个接口,传入什么对象就调用它的方法
    animal.eat()
​
​
func(pig)
​
  • abc模块

    abstract的缩写 ,抽象的意思

    • 使用ABC模块的步骤

      1. 为类中指定元类为metaclass = abc.ABCMeta

      2. 在相应的方法上加上@abc.abstractmethod

    import abc
    class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
        @abc.abstractmethod
        def talk(self):
            passclass People(Animal): #动物的形态之一:人
        def talk(self):
            print('say hello')
    ​
    class Dog(Animal): #动物的形态之二:狗
        def talk(self):
            print('say wangwang')
    ​
    class Pig(Animal): #动物的形态之三:猪
        def talk(self):
            print('say aoao')
            
            
    # 使用ABC装饰器的目的,将基类变为抽象基类,严格要求子类对象必须使用基类中被装饰的的方法,如果子类中没有该方法则报错.
  • 鸭子类型

    • 在现实中一个物体叫声象鸭子,走路也像鸭子,那么人们就把它当做鸭子

    • 对应到编程中就是两个独立的类,没有任何关联,但是两者的方法和 属性都一致(长得像),那么两者就可以实现多态(不同对象响应同一种方法的表现出不同的行为,产生不同的结果).这就是鸭子类型.

# 类Foo和Bar都拥有两种相同的方法,故两者称之为鸭子类型
class Foo:
    def f1(self):
        print('from foo.f1')
​
    def f2(self):
        print('from foo.f2')
​
​
class Bar:
    def f1(self):
        print('from bar.f1')
​
    def f2(self):
        print('from bar.f2')
​
​
obj1 = Foo()
obj2 = Bar()
​
# (obj1,obj2)不同对象针对同一方法(f1)产生不同的结果
obj1.f1()
obj2.f1()
#  (obj1,obj2)不同对象针对同一方法(f2)产生不同的结果
obj1.f2()
obj2.f2()

 

免责声明:文章转载自《面向对象三大特性之多态》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇model,form,ModelForm的比较常用模块之configpaser与shutil下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

面向对象的多态(二)

书接上一回,我们先回顾一下上一篇文章里面出现问题的代码。 voidNavigate(stringbrowser){switch(browser){case"IE":NavigateInIE();case"FF":NavigateInFF();}}voidBack(stringbrowser){switch(browser){case"IE":BackInI...

201521123027 《JAVA程序设计》第四周学习总结

1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点。 1.2 使用常规方法总结其他上课内容。①多态:相同方法名,不同实现;②instanceof运算符:判断父类引用所引用的对象实例的实际类型;③abstract关键字来修饰抽象类,抽象类必须被继承;④object-toString方法与Arrays的toString方法的不同;⑤object中eq...

python抽象篇:面向对象基础

1.面向对象概述 面向过程编程:根据操作数据的函数或语句块来设计程序的。 函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象编程:数据和功能结合起来,用称为对象的东西包裹起来组织程序的方法; 在大多数时候你可以使用面向过程编程,但是有些时候当需要编写大型程序或是寻求一个更加合适的解决方案的时候,就需要面向对象的编程,Pytho...

C++多态意义探究

原理简介: 多态成立的三个条件: 存在继承 虚函数重写 父类指针指向子类对象 之前有看过一个例子: 1 #include <iostream> 2 using namespacestd; 3 4 classFather 5 { 6 public: 7 voidFace() 8 { 9 cout <<...

C++解析(23):多态与C++对象模型

0.目录 1.多态 2.C++对象模型 2.1 使用C语言实现封装 3.继承对象模型 4.多态对象模型 4.1 使用C语言实现多态 5.小结 1.多态 面向对象中期望的行为: 根据实际的对象类型判断如何调用重写函数 父类指针(引用)指向 父类对象则调用父类中定义的函数 子类对象则调用子类中定义的重写函数 面向对象中的多态的概念...

通过类的多态性确定人类的说话行为

实现效果: 知识运用: 实现代码: class People { //定义一个虚方法表示人说话的行为 public virtual void Say(RichTextBox rtb, string name){ rtb.Tex...