问题标签 [abstract-base-class]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
627 浏览

django - Django 字段与多个抽象基类发生冲突

我正在尝试定义实体架构,如果简化,可以这样表示:

如您所见,X有一些混入(抽象实体)。每个 mixin 都在其中实现了自己的自定义逻辑。但最终它们都有一个共同的父摘要class A

据我了解,这应该有效。MRO 解决方案确实有效。但是,在启动项目时,每个字段字段A(在 中继承X)出现 2 个错误:

我正在使用 Django 1.11

0 投票
1 回答
211 浏览

python - 创建一个继承自 Exception 的抽象基类

我正在尝试为我的应用程序中引发的异常创建一个自定义基类。我想让它成为一个不能直接实例化的抽象类(使用 abc 模块),以强迫自己为不同类型的错误情况定义更具体的具体子类。

我可以定义一个继承自自定义具体类的抽象类。然而,令我惊讶的是,如果我让抽象类(直接或间接)从 Exception 继承,它可以再次直接实例化,从而破坏了首先使其抽象的目的。

我想了解这里发生了什么,以便我可以使我的自定义异常类抽象为真实而不是直接可实例化。

我尝试了将自定义异常类声明为抽象的不同变体,包括使用metaclass=abc.ABCMeta语法以及从abc.ABC. 不管它被声明为抽象的方式如何,只要我让它继承自Exception.

对我来说相关的 Python 版本是 3.5、3.6 和 3.7。我已经在 Python 3.5.2 (Ubuntu 16.04) 和 3.6.8 (Ubuntu 18.04) 上测试了以下代码。

以下似乎按预期工作:由于抽象方法 ( TypeError: Can't instantiate abstract class AppException with abstract methods abs_method),实例化 AppException 失败。

请注意,尽管这些类被称为*Exception,但它们(尚未)继承自真正的内置 Exception 类。

当我将 BaseException 的定义更改为从实际Exception类继承时:

然后TypeError消失了,所以这次 AppException 的实例化确实有效。AppException不再表现为抽象类,即使在我的理解中,它应该。

这是实际的代码,目前作为 PR 草案一直停留在我弄清楚发生了什么之前。

0 投票
1 回答
963 浏览

python - pybind11 中是否可以使用 py::cast 访问抽象基类?

我在下面包含了一个最小的工作示例 - 它可以使用典型的 pybind11 指令进行编译(我使用 cmake)。

我有一个抽象基类Abstract,它是纯虚拟的。我可以使用“蹦床类”轻松地将其包装在 pybind11 中(pybind11 对此进行了详细记录)。

此外,我有一个 , 的具体实现AbstractToBeWrapped它也使用 pybind11 包装。

我的问题是我有一些客户端代码接受任意PyObject*(或者,在本例中为 pybind11 的 wrapper py::object)并希望将其转换为Abstract*.

但是,如我的示例所示,我无法py::objectAbstract*.

我没有问题将其转换为Python 解释器正在发送的 Abstract*` ToBeWrapped*,然后将其存储为抽象基类的目的。Abstract*', however this would require my client code to know ahead of time what kind of

TL;博士

是否可以修改此代码,以便客户端accessMethod能够任意处理Abstract*从 python 解释器传递的内容?

0 投票
1 回答
400 浏览

python - Python Generator 抽象基类没有实现必要的__del__,这是故意的吗?

Python 中的生成器对象需要有一个close存在的方法,以确保try...finally:在对象被垃圾回收之前退出上下文管理器并运行块。

PEP 342定义了生成器必须实现的方法sendthrow和。具体来说,它指出:close__del__

g.__del__()g.close(). 这将在生成器对象被垃圾收集时调用(在 CPython 中,这是它的引用计数变为零时)。

Generator 的抽象类型在collections.abc

这种抽象类型强制send,throwclose在子类中实现,但__del__既不抽象也不具体实现,也不强制实现它。它的元类也没有。

天真地,生成一个不手动定义__del__哪个包装的子类会close产生未正确清理的生成器。垃圾收集器只调用__del__,因此如果__del__不存在,close则不调用。

这是故意的吗?

在一个相关的问题中,snakecharmerb向我指出__del__,如语言参考所示,实现起来可能很困难,但我不明白为什么这也不适用于 Python 原生生成器中__del__作为包装器的正确实现close对象。

0 投票
1 回答
30 浏览

c++ - 从 BubbleSort * 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"

我有一个我正在编写的程序,它有一个抽象基类“AssortedSorted”、一个派生类“BubbleSort”和一个用于测试排序“AssortedSorterTest”的类。

想法是创建一个 bubbleSort 实例,将该实例传递给 assortedSorterTest 的一个实例以及一个用于创建和排序的随机数数量的 int,如果向量已排序并包含与给定向量的元素数量相同。

如果您阅读代码,则需要更改一些内容才能完成此操作,但我不关心纠正这些内容,除非它们与我目前遇到的关于 main.cpp 中第 16 行的无效初始化的问题相关。我得到的错误是这个

“从 BubbleSort * 类型的右值对 'AssortedSorter&' 类型的非常量引用进行无效初始化”

最初我认为将 #include "BubbleSort.h" 添加到 AssortedSorterTest 类可能会解决问题,但事实并非如此。我也尝试过更改一些对指针的引用,这给我带来了新的问题,所以我切换回了引用。我没有任何运气来解决这个问题,所以任何治疗都将不胜感激。

0 投票
1 回答
431 浏览

django - Django:从抽象基类模型中覆盖模型方法

我正在尝试在 Django 中使用抽象基类模型来避免编写一些重复的代码并遇到一些意外行为。

这是我的抽象基类的简化版本:

我需要定义方法 document_file_path 否则代码会产生错误。我想在 document_file_path 的子类中定义不同的行为。下面是一个例子:

子方法似乎没有覆盖父方法,因为我在运行上面的代码时收到一个错误,即 document_file_path 返回 NoneType。我尝试让 AbstractDocument 中的方法返回一个实际路径,但在那种情况下,子方法也不会覆盖父方法。

有什么原因我想做的事情是不可能的吗?我在实施中缺少什么吗?是否有另一种或更好的方法来实现这一点?

在此先感谢您的帮助!

0 投票
2 回答
81 浏览

python - 哪些内置抽象基类支持切片?

Python 的文档在https://docs.python.org/3/library/collections.abc.html中非常清楚地列出了抽象基类的实现应该具有的所有方法。然而,切片有时仅作为__getitem__.

我想所有继承自的类Sequence都会实现它,是这样吗?还有其他方法可以知道对象支持切片吗?

编辑:我还在文档中找到了https://docs.python.org/3/library/stdtypes.html#typesseq-common。它将这些方法列为“大多数序列类型支持”。
我将其视为“序列类型应实现切片”并使用它进行注释。

0 投票
1 回答
90 浏览

c# - 当变量/对象中涉及特定方法时,C# Override

我知道如何创建虚拟方法并覆盖它们。例子

基类:

子类:

但是,我想更改一条消息,其中包含带有方法调用和其他对象的 JObject

目前在抽象基类方法中就是这个代码

所以我添加了一个虚拟方法来覆盖这个消息

所以在我的子类中,有一个覆盖 - 我如何能够替换“var message”中近一半的代码?

例子

根据评论...

更新具体示例:

基类:

然后是一个典型的子类:

现在,我想要一个覆盖来换出 var 消息....

我不清楚如何替换产生 json 的 JObject 中的几个匿名类型和方法。我正在玩一个新的子类并创建它

0 投票
1 回答
882 浏览

python-3.x - 在显式子类型构造期间未调用 typing.Protocol 类 `__init__` 方法

Python 的PEP 544引入typing.Protocol了结构子类型,也就是“静态鸭子类型”。

在这个 PEP 关于合并和扩展协议的部分中,声明了

一般的理念是协议大多类似于常规的 ABC,但静态类型检查器会专门处理它们。

因此,人们期望从 的子类继承与期望从 的子类继承的typing.Protocol方式大致相同abc.ABC

正如预期的那样,具体的子类Concrete1继承Concrete2method它们各自的超类。此行为记录在 PEP 的显式声明实现部分中:

要显式声明某个类实现给定协议,可以将其用作常规基类。在这种情况下,一个类可以使用协议成员的默认实现。

...

请注意,显式和隐式子类型之间几乎没有区别,显式子类化的主要好处是“免费”获得一些协议方法。

但是,当协议类实现__init__方法时,__init__不会协议类的显式子类继承。这与继承方法的ABC子类相反:__init__

我们看到,Concrete1继承__init__AbstractBase,但Concrete2不继承__init__ProtocolBase。这与前面的示例形成对比,其中Concrete1和都从各自的超类Concrete2继承。method

我的问题是:

  1. __init__被协议类的显式子类型继承的原因是什么?协议类无法__init__“免费”提供方法是否存在某种类型理论的原因?
  2. 是否有任何关于这种差异的文件?或者它是一个错误?
0 投票
1 回答
65 浏览

python - Python:尝试从 ABC 创建子项时出现 AttributeError

我正在尝试从我在大学上过的初学者 CS 课程中重构一些旧代码

我注意到从那时起(2017 年)python 发生了很多变化

我也无法找到任何非常有用的在线教程来编写和使用 Python 的抽象基类(文档除外),所以对于编写和使用 ABC 的正确方法,我几乎没有什么可做的。

目前我有两个问题,一个更明确:

当我尝试运行“Hero.py”脚本时出现

这是 Enemy 抽象基类

另一个问题是智能感知或 vscode 在查找我的导入文件时遇到问题,尽管它们都在同一个目录中。它强调了“敌人”在from Enemy import Enemy

我的类名和包含该类的文件具有相同的标题是否有问题?

我提出了关于导入的第二个问题,因为我怀疑它可能是第一个错误的原因。此导入行之前导致错误,直到我在我的首选项中编辑了一些内容:python 语言特定配置文件(注释掉“python.jediEnabled”行:false,因为来自不同 stackoverflow 帖子的解决方案,其中用户有一个类似的问题)保存这些更改后,Hero.py 和 Enemy.py 脚本暂时工作,但不久后我开始收到上面提到的这个 AttributeError。