文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-04 15:58

关注

这篇文章主要介绍了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')

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

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

2.2.类方法多态重构业务

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯