Python类的多态和多态性

一、多态

多态指的是一类事物有多种形态,一个类有很多个子类,因而多态的概念是基于继承的

  • 序列数据类型有多种形态:字符串,列表,元组
  • 动物有多种形态:人,狗,猪

1.动物的多种形态

# 动物有多种形态:人类、猪、狗
class Animal:
    def run(self):  # 子类约定俗称的必须实现这个方法
        raise AttributeError('子类必须实现这个方法')


class People(Animal):
    def run(self):
        print('人正在走')


class Pig(Animal):
    def run(self):
        print('pig is walking')


class Dog(Animal):
    def run(self):
        print('dog is running')


peo1 = People()
pig1 = Pig()
d1 = Dog()

peo1.run()
pig1.run()
d1.run()

输出

人正在走
pig is walking
dog is running
import abc


class Animal(metaclass=abc.ABCMeta):  # 同一类事物:动物
    @abc.abstractmethod  # 上述代码子类是约定俗称的实现这个方法,加上@abc.abstractmethod装饰器后严格控制子类必须实现这个方法
    def talk(self):
        raise AttributeError('子类必须实现这个方法')


class 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')


peo2 = People()
pig2 = Pig()
d2 = Dog()

peo2.talk()
pig2.talk()
d2.talk()

输出

say hello
say aoao
say wangwang

2.文件的多种形态

#Python学习交流QQ群:489111204
# 文件有多种形态:文件、文本文件、可执行文件
import abc


class File(metaclass=abc.ABCMeta):  # 同一类事物:文件
    @abc.abstractmethod
    def click(self):
        pass


class Text(File):  # 文件的形态之一:文本文件
    def click(self):
        print('open file')


class ExeFile(File):  # 文件的形态之二:可执行文件
    def click(self):
        print('execute file')


text = Text()
exe_file = ExeFile()

text.click()
exe_file.click()

输出

open file
execute file

二、多态性

  • 多态与多态性是两种概念

  • 多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

1.动物形态多态性的使用

多态性:一种调用方式,不同的执行效果(多态性)

def func(obj):
    obj.run()


func(peo1)
func(pig1)
func(d1)

输出

人正在走
pig is walking
dog is running

多态性依赖于:继承
多态性:定义统一的接口

#Python学习交流QQ群:489111204 
def func(obj):  # obj这个参数没有类型限制,可以传入不同类型的值
    obj.talk()  # 调用的逻辑都一样,执行的结果却不一样


func(peo2)
func(pig2)
func(d2)

输出

say hello
say aoao
say wangwang

2. 文件形态多态性的使用

def func(obj):
    obj.click()


func(text)
func(exe_file)

输出

open file
execute file

3. 序列数据类型多态性的使用

def func(obj):
    print(len(obj))


func('hello')
func([1, 2, 3])
func((1, 2, 3))

输出

5

3

3

综上可以说,多态性是一个接口(函数func)的多种实现(如obj.run(),obj.talk(),obj.click(),len(obj))

三、多态性的好处

其实大家从上面多态性的例子可以看出,我们并没有增加新的知识,也就是说Python本身就是支持多态性的,这么做的好处是什么呢?

  • 增加了程序的灵活性:以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
  • 增加了程序额可扩展性:通过继承Animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用
class Cat(Animal):  # 属于动物的另外一种形态:猫
    def talk(self):
        print('say miao')


def func(animal):  # 对于使用者来说,自己的代码根本无需改动
    animal.talk()


cat1 = Cat()  # 实例出一只猫
func(cat1)  # 甚至连调用方式也无需改变,就能调用猫的talk功能

say miao

上述代码我们新增了一个形态Cat,由Cat类产生的实例cat1,使用者可以在完全不需要修改自己代码的情况下。使用和人、狗、猪一样的方式调用cat1的talk方法,即func(cat1)

四、小结

多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度)
多态性:一种调用方式,不同的执行效果(多态性)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python类的多态和多态性 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • Python3教程:math 模块的用法

    我们知道 Python 有很多运算符可以进行数学运算,如果是简单的问题还好说,但是要处理一些相对复杂的问题也要我们自己一行一行手动的来编写吗?答案当然不是,Python 提供了 math 模块对一些数学运算提供了支持。 1.简介 math 模块提供了对 C 标准定义的数学函数的访问,但该模块并不支持复数运算,如果想使用复数预算需使用 cmath 模块,将支持…

    Python开发 2023年4月2日
    00
  • Python教程:文件和读写的详细教程

    文件操作的模式 文件操作的模式如下表: 1. open 打开文件 使用 open 打开文件后一定要记得调用文件对象的 close() 方法。比如可以用 try/finally 语句来确保最后能关闭文件。 file_object = open(r’D:\test.txt’) # 打开文件 try: all_the_text = file_object.read…

    Python开发 2023年4月2日
    00
  • Python中的关键字的用法

    Python有哪些关键字 Python常用的关键字 and, del, from, not, while, as, elif, global, or, with, assert, else, if, pass, yield, break, except, import, print, class, exec, in, raise, contiue, fina…

    Python开发 2023年3月31日
    00
  • python教程:函数的return语句运用

    return语句用于退出函数,向调用方返回一个表达式。 return在不带参数的情况下(或者没有写return语句),默认返回None。 None是一个特殊的值,它的数据类型是NoneType。NoneType是Python的特殊类型,它只有一个取值None。 它不支持任何运算也没有任何内建方法,和任何其他的数据类型比较是否相等时永远返回false,也可以将…

    Python开发 2023年4月2日
    00
  • python3教程:*和**的打包和解包的用法

    一. 打包参数 1. * 的作用:在函数定义中,收集所有的位置参数到一个新的元组,并将这个元组赋值给变量args >>> def f(*args): print(args) >>> f() () >>> f(1) (1,) >>> f(1, 2, 3, 4) (1, 2, 3, 4) &…

    Python开发 2023年4月2日
    00
  • Python教程:with语句的用法

    一 、with语句的原理 上下文管理协议(Context Management Protocol):包含方法 __enter__()和__exit__(),支持该协议的对象要实现这两个方法。 上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__()和__exit__()方法。上下文管理器定义执行with语…

    Python开发 2023年4月2日
    00
  • Python中logging模块用法

    一、低配logging 日志总共分为以下五个级别,这个五个级别自下而上进行匹配 debug–>info–>warning–>error–>critical,默认最低级别为warning级别。 1.v1 import logging logging.debug(‘调试信息’) logging.info(‘正常信息’) loggi…

    Python开发 2023年3月31日
    00
  • python学习:反射的四种基本方法

    class Person(object): def __init__(self): pass def info(self): print(‘我是person类中的info方法’) 1.getattr()方法 这个方法是根据字符串去某个模块中寻找方法 instantiation = reflect.Person()#先实例化 f = getattr(insta…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部