ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

防止理论上抽象的类实例化为什么很重要?

2019-11-11 15:59:09  阅读:255  来源: 互联网

标签:python-2-7 inheritance abstract-class python


我有两个数据结构,Frontier(队列)和Explored(一组).我想实现一个他们共享的自定义__contains__方法:

class Custom_Structure:
    def __contains__(self, item):
        # TODO         

class Frontier(Custom_Structure):
    def __init__(self):
        self.queue = Queue.Queue()

class Explored(Custom_Structure):
    def __init__(self):
        self.set = set()

我了解继承和抽象类的理论(至少,我认为我知道!).在这里,使Custom_Structure成为抽象类似乎是适当的,因为我不希望实例化它.只有这样,Frontier和Explored才能共享__contains__方法.我不需要任何抽象方法,但是没关系,因为我已经读到抽象类不一定需要抽象方法.

如果我在C#中执行此操作,则只需添加abstract关键字,而不会问这个问题.但是在Python(2.7)中,似乎我需要执行以下操作:

from abc import ABCMeta

class Custom_Structure:
    __metaclass__ = ABCMeta
    ...

好的,这还没什么大不了的,但是它不是很可读,只是感觉像是过分杀人而没有太多好处.我很想只保留我的代码.

所以我的问题是:为什么要麻烦使Custom_Structure抽象化呢? (那么,如果有人实例化基类怎么办?)

我已经找到以下问题,但他们并没有完全回答问题:

Why use Abstract Base Classes in Python?这里的答案似乎并不适用,因为我没有任何抽象方法,因此基类与子类之间没有约定.

What is the main advantage of making a class abstract同样

Abstract class with no abstract methods的答案是“防止实例化”,但是为什么会有这样的问题呢?

What’s the point in having an abstract class with no abstract methods?同样

Why use an abstract class without abstract methods?同样.我理解为什么不应该实例化它的理论概念,但是实际上有什么大不了的?

我已经阅读了有关抽象类背后的理论的各种问题和答案-我的问题不是关于它们是什么以及它们如何工作的(尽管如果我记错了,请告诉我),在这种简单的方法中,更多的是“好处是什么”案件?

解决方法:

有趣的问题.首先,我要说的事实是,这丑陋是在python2中创建抽象类的方式.

from abc import ABCMeta

class Custom_Structure:
    __metaclass__ = ABCMeta

…已经表明Python独裁者并不认为将类标记为显式抽象是那么重要.

也就是说,将类抽象化是将元数据添加到代码中的一种有用方法.这是类的作者与模块的未来用户进行通信的一种方式.

在说什么两件事情:

>抽象类是不完整的,不应实例化.此类的实例没有具体含义,因为定义是局部的.它缺少使对象正常工作所需的全部信息.
>抽象方法是定义的缺失部分.通过使方法抽象化,您表示要使该类有意义,必须提供完整描述的特定部分.不仅如此,而且通过提供一个接口,您可以传达丢失的部件的预期行为,无论最终内部细节是什么.

当然,实际上所有情况都是如此,而无需为类或其方法提供任何其他规范,但是继承者最终会猜测如何使用该对象,或者必须详细阅读文档.

如果实例化隐式抽象类,迟早会发生错误.缺少某些内容时,可能最终产生NotImplementedError或KeyError.这个错误很容易造成,并且在尝试使用对象的功能时会不断出现.

如果尝试实例化一个显式抽象类,则该错误是立即发生的.没有抛出任何骰子,并且无论何时以一种或另一种方式使用该类,问题都不会推迟.如果使用抽象方法,缺少抽象方法的实现不会导致错误,但会导致编码错误.

总结起来,使类及其某些方法显式抽象,使代码的真实性符合文档要求.它将了解规则的责任从没有经验的用户转移到了作者.这是让语言运行库在实践中强制实施理论规则和使用约束的一种方式.

标签:python-2-7,inheritance,abstract-class,python
来源: https://codeday.me/bug/20191111/2020800.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有