我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python中怎么通过@classmethod实现多态

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python中怎么通过@classmethod实现多态

这篇文章主要介绍了Python中怎么通过@classmethod实现多态的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python中怎么通过@classmethod实现多态文章都会有所收获,下面我们一起来看看吧。

通过@classmethod 实现多态

1.概述

python中通常使用对象创建多态模式,python还支持类创建多态模式。下面通过一个例子展示它如何实现多态。

通过对象创建多态和类创建多态开发模式区别

  • 对象多态模式:接收的是一个父类类型对象,然后通过传入父类的子类对象调用普通同名方法,实现不同的行为。

  • 类多态模式:接收的一个父类,然后通过传入父类的子类调用同名的类方法,实现不通的行为

2.类方法创建多态模式示例

2.1.普通模式

先通过一个的示例看下常规方式发开的代码没有使用多态时候存在的问题,然后在通过类多态来优化代码。

下面实现一个读取数据,然后处理数据的示例,他有两条继承体系。
输入信息体系:将输入信息的方式创建为类继承关系,可以根据读取信息的方式创建不同的InputData子类。
处理数据体系:将处理信息的方式创建类继承关系,根据对信息处理的方式创建不同的Worker子类。

然后通过mapreduce函数组合业务执行逻辑,最后输出运行结果。

# 接收输入信息类体系class InputData:    def read(self):        raise NotImplementedErrorclass PathInputData(InputData):    def __init__(self,path):        super().__init__()        self.path = path    def read(self):        with open(self.path) as f:            return f.read()# 处理信息类体系class Worker:    def __init__(self, input_data):        self.input_data = input_data        self.result = None    def map(self):        raise NotImplementedError    def reduce(self, other):        raise NotImplementedErrorclass LineCountWorker(Worker):    def map(self):        data = self.input_data        self.result = data.count('/n')    def reduce(self, other):        self.result += other.result# 组合业务import osdef generate_inputs(data_dit):    for name in os.listdir(data_dit):        # 读文件内容        yield PathInputData(os.path.join(data_dit, name))def create_workers(input_list):    workers = []    for input_data in input_list:        # 处理数据        workers.append(LineCountWorker(input_data))    return workersfrom threading import Threaddef execute(workers):    threads = [Thread(target=w.map) for w in workers]    for thread in threads: thread.start()    for thread in threads: thread.join()    first, *rest = workers    for worker in rest:        first.reduce(worker)    return first.resultdef mapreduce(data_dir):    inputs = generate_inputs(data_dir)    workers = create_workers(inputs)    return execute(workers)import osimport randomdef write_test_files(tmpdir):    os.makedirs(tmpdir)    for i in range(100):        with open(os.path.join(tmpdir, str(i)), 'w') as f:            f.write('\n' * random.randint(0, 100))tmpdir = 'test_inputs'write_test_files(tmpdir)result = mapreduce(tmpdir)print(f'There are  {result} lines')

上面接收信息处理信息的示例存在两个问题:

  • mapreduce函数通用性不好,不易扩展。例如现在创建了新的InputData、Worker子类,那么就要创建一个新的mapreduce函数来组合新的业务流程,这样会导致重复的代码越来越多,不利于维护。

  • python不能向java语言可以在一个类中以重载的形式创建多个构造器,创建一个构造器多态让子类可以根据不同的构造器接收不同的参数。而python不能这么做,因为python的类只能有一个构造方法(init),所以没有办法为不同的子类提供多种形式的形参构造器,在继承中也没有办法要求所有的子类都只接收只有一种方式参数的构造方法。因为子类要根据自身的特点接收不同类型的参数。

这个问题最好能够通过类方法多态来解决,这种多态与实例方法多态很像,只不过他针对的是,而不是这些类的对象

2.2.类方法多态重构业务

类方法多态的实现非常简单,下面将代码中关键的点提炼出来。

  • 在父类中创建一个通用的方法,不需要实现任何业务逻辑,然后让子类中重写该方法,实现不同的行为。在方法上使用@classmethod装饰器声明为类方法,方便调用时候可以以类调用,而不是实例对象调用,通过子类重写父类的类方法就是类方法多态。

  • 在GenericInputData类中定义一个类方法(generate_inputs)用来解决python只有一个构造方法不能实现多种方式接收参数的弊端,子类通过重写该方法,实现接收多种参数行为。

class GenericInputData:    def read(self):        raise NotImplementedError# 创建一个多态的类方法,让子类实现不同的功能    @classmethod    def generate_inputs(cls, config):        raise NotImplementedErrorclass PathInputData(GenericInputData):    def __init__(self, path):        super().__init__()        self.path = path    def read(self):        with open(self.path) as f:            return f.read()# 子类重写父类的类方法    @classmethod    def generate_inputs(cls, config):        data_dir = config['data_dir']        for name in os.listdir(data_dir):            yield cls(os.path.join(data_dir, name))class GenericWorker:    def __init__(self, input_data):        self.input_data = input_data        self.result = None    def map(self):        raise NotImplementedError    def reduce(self, other):        raise NotImplementedError    @classmethod    def create_workers(cls, input_class, config):        workers = []        for input_data in input_class.generate_inputs(config):            workers.append(cls(input_data))        return workersclass LineCountWorker(GenericWorker):    def map(self):        data = self.input_data.read()        self.result = data.count('\n')    def reduce(self, other):        self.result += other.result# 定义的形参类型为父类,实现了类方法多态def mapreduce(worker_class, input_class, config):    workers = worker_class.create_workers(input_class, config)    return execute(workers)config = {'data_dir': tmpdir}result = mapreduce(LineCountWorker, PathInputData, config)print(f'There are {result} lines')

通过类方法多态重构代码后,mapreduce函数支持了多态,它接收的是一个父类类型,根据传入的实际子类实现把不同的功能。当再扩展GenericInputData、GenericWorker子类后,mapreduce函数不需要修改代码,实现了左开右闭原则。

关于“Python中怎么通过@classmethod实现多态”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Python中怎么通过@classmethod实现多态”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python中怎么通过@classmethod实现多态

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中怎么通过@classmethod实现多态

这篇文章主要介绍了Python中怎么通过@classmethod实现多态的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python中怎么通过@classmethod实现多态文章都会有所收获,下面我们一起来看看吧
2023-07-04

怎样通过函数实现C++多态性

这期内容当中小编将会给大家带来有关怎样通过函数实现C++多态性,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C++多态性主要体现在虚函数的调用,在C++中,虚函数的调用使用的是动态绑定,也有人说是晚捆绑,
2023-06-17

C++中怎么实现多态

C++中怎么实现多态,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实现了C++多态 2 5 1 6#include < iostream> using namespace st
2023-06-17

Java中怎么实现多态

这篇文章将为大家详细讲解有关Java中怎么实现多态,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。多态多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确
2023-06-20

Windows 中通过Python实现p

由于ping命令在ping的时候无法加入时间,不能够直观分析结果。便想在ping的时候加入时间戳。1.首先需要系统配置了Python的环境,我的环境如下,这里就不介绍环境搭建步骤。2.以下是代码展示,新建一个ping.py文件import
2023-01-31

PHP5中怎么实现多态性

PHP5中怎么实现多态性,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、 PHP 5和多态性本文想讨论面向对象编程中最为重要的部分之一--多态性的设计。为了说明问题,我使用了
2023-06-17

C#中怎么实现多态性

在C#中实现多态性一般通过继承和接口实现。具体方法如下:继承:通过创建一个父类和多个子类,子类继承父类的特性,并且可以重写父类的方法来实现多态性。例如:class Animal{public virtual void MakeSound(
C#中怎么实现多态性
2024-03-06

Android中怎么通过自定义view实现动态柱状图

这篇文章将为大家详细讲解有关Android中怎么通过自定义view实现动态柱状图,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。自定义viewpublic class Histogram ex
2023-05-30

golang怎么实现多态

在 Go 语言中,多态的实现和其他编程语言有些不同。由于 Go 语言没有继承的概念,因此不能像其他语言一样通过将不同类型的对象赋值给父类型的变量来实现多态。但是,Go 语言提供了接口(interface)的机制,可以实现类似多态的效果。在
2023-10-26

golang多态怎么实现

在Go语言中,多态可以通过接口和类型断言来实现。使用接口实现多态:定义一个接口,包含多个方法。type Animal interface {Sound() string}定义多个结构体,并实现接口的方法。type Dog struct
golang多态怎么实现
2024-02-29

SpringBoot中怎么通过配置Profile实现多环境支持

本篇文章给大家分享的是有关SpringBoot中怎么通过配置Profile实现多环境支持,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Profile1.多Profile文件我们
2023-06-20

c++中可以通过指针或引用实现多态的原因是什么

这篇文章主要介绍c++中可以通过指针或引用实现多态的原因是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!引言:在c++中司空见惯的事情就是:可以通过指针和引用可以实现多态,而对象不可以。 那为什么?让我们来解开这
2023-06-14

Python中怎么用django filter实现多条件过滤

在Django中,可以使用`filter()`方法实现多条件过滤。`filter()`方法接收一个或多个条件表达式作为参数,并返回符合这些条件的对象集合。以下是一个示例,演示如何使用`filter()`方法实现多条件过滤:from dj
2023-10-25

springboot怎么通过spel结合aop实现动态传参

这篇文章主要介绍了springboot怎么通过spel结合aop实现动态传参的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot怎么通过spel结合aop实现动态传参文章都会有所收获,下面我们一起
2023-07-06

OpenCV-Python怎么实现通用形态学函数

这篇文章将为大家详细讲解有关OpenCV-Python怎么实现通用形态学函数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。通用形态学函数,我们介绍了形态学的基础腐蚀与膨胀操作,而将腐蚀与膨胀结合起来进行组
2023-06-15

golang interface多态怎么实现

在Go语言中,通过接口可以实现多态。接口是一种抽象类型,它定义了一组方法的签名。任何类型只要实现了接口中定义的方法,就可以被看作是该接口的实现类型。下面是一个示例,展示了如何在Go语言中实现多态:package mainimport "
golang interface多态怎么实现
2024-02-29

python怎么通过pillow识别动态验证码

这篇文章主要讲解了“python怎么通过pillow识别动态验证码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python怎么通过pillow识别动态验证码”吧!生活中,我们在登录微博,邮
2023-06-21

python多线程怎么实现动态图绘制

今天小编给大家分享一下python多线程怎么实现动态图绘制的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、背景有些情况下,
2023-06-30

怎么通过Python实现批量数据提取

这篇文章主要介绍“怎么通过Python实现批量数据提取”,在日常操作中,相信很多人在怎么通过Python实现批量数据提取问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么通过Python实现批量数据提取”的疑
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录