问题标签 [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 回答
20 浏览

python - 不同版本的类在 python 中的最佳实现,都具有相同的方法,这些方法将根据环境变量进行选择?

所以我有很多函数,每个函数都对服务进行 api 调用,进行一些处理并返回一些东西。但是,其中有几个服务是相似的,我基本上需要为每个服务创建具有所有相同功能的类,但根据环境变量的值,在运行时只会使用这些类中的一个。

在 python 中执行此操作的最佳方法是什么?

我可以使用 ABC 创建一个抽象基类,确保所有这些类都实现相同的功能。

但是,我正在努力解决的是如何在其余的 python 代码中获得该类。

我是否应该创建另一个具有所有这些相同功能的类,但获得这些子类中的正确一个并将所有函数调用推迟到该类?

或者,还有更好的方法?

0 投票
1 回答
40 浏览

c++ - 如何要求用户在我的代码中输入数字以打印结果

我如何要求用户输入这两个数字并在此处以 C++ 打印结果?拜托我需要你的帮忙。我是 C++ 新手。

0 投票
0 回答
64 浏览

python - 如何使用 Pydantic 创建 Python ABC 接口模式

我正在使用抽象基类(称为策略模式)实现 Python 接口。我希望能够用 Pydantic 做到这一点。

如果没有 Pydantic,我会使用如下属性:

这样,如果我要实现另一个类,比如

那么界面就会报错。这有助于约束任何继承自PersonEntity.

但是,我想将此信息吐到 FastAPI 响应对象中。如果不找出某种序列化程序来获取每个属性字段的所有值,以及只是属性字段(我正在努力做到这一点),我就无法做到这一点。

我宁愿使用 Pydantic。在这种情况下,我不需要属性,我可以简单地做:

这些将以我需要的方式序列化,但我失去了接口功能,因为现在我没有属性,因此无法使用 @abstractproperty.

所以如果我要实施

没有错误,因为 pydantic 允许这样做。

(顺便说一句,在这些示例中,我不确定是否从子类中的 BaseModel 继承。)

有什么方法可以约束 Pydantic 模型给我我需要的接口行为,当引入一个不包含在 ABCPersonEntity类中的字段时抛出错误?

0 投票
2 回答
47 浏览

c++ - C++:分段错误 - 通过 std::vector<> 使用虚函数和抽象类调用函数

对于某些人来说,这可能是一个完全明显的错误,但我似乎无法找出为什么会发生这种分段错误。

我确实了解在访问我的程序不应访问的地址时会发生分段错误。

首先,我有一个名为“UiObject”的基类:

然后,我从 UiObject 类派生多个其他类:例如 ProgressBar 类:

现在,这些对象由 UiManager 管理和呈现。函数 renderDisplay() 是使用 std::thread 创建的线程:

如您所见,对于每个添加的显示,我都在检索帧缓冲区。我正在打开 /dev/fbX 文件,以便可以直接在屏幕上绘图。这一切都很好。d.getFramebuffer() 返回一个 char * 指针,以便我可以操作像素,然后将其传递给任何 UiObject 的 render(char * framebuffer) 函数。

但是,这个函数调用正在创建一个段错误,我不明白为什么。有时它会工作并一直运行直到线程应该停止,有时它会在第一次渲染函数调用后立即崩溃。

我使用以下方法将 UiObjects 添加到 UiManager:

UiManager 有这个作为它的类定义:

现在我想知道为什么会这样。

根据 cppreference https://en.cppreference.com/w/cpp/language/abstract_class及其关于抽象类的文档,我不允许有 =0; 在我的 UiObject 类中。如果我删除它,我将在链接过程中收到编译器警告,并显示消息“未定义对 UiObject 的 vtable 的引用”。

我做错了什么?

我怀疑 std::vector 和 for 循环在 UiManager 中不太有效。

我在 debian 上使用 g++ 作为我的编译器。

我的控制台输出:

它甚至不跳入 ProgressBar 渲染例程。我还注释掉了渲染函数的内容,因此我只能怀疑特定的函数调用。

0 投票
2 回答
57 浏览

python - 创建新的基类实例时初始化子类实例

概括

TLDR:是否有可能调用/实例化基类实际上返回一个初始化的子类实例?

例子

考虑这个Animal基类CatDog子类:

这按预期工作:

现在,我想扩展它,以便调用Animal类应该返回它的一个子类,即第一个不会引发错误的子类。

所以,我想c3 = Animal(0.7)返回一个Cat实例。

试图

我知道在实例化基类时如何从子类返回一个实例,但前提是它可以在运行之前__init__确定,它是哪一个。

所以,这行不通……

...因为ValueError只有在实例已经创建并返回时才会引发:

有没有办法做到这一点?

当前的解决方法

这可行,但与类分离,并且感觉集成度差/高度耦合。

编辑

  • 感谢@chepner 的__subclasses__()建议;我已将其整合到问题中。
0 投票
2 回答
46 浏览

python - Python:为不同类型实现基类

我想知道是否有办法为不同类型实现基类的子类。每个子类应具有单独的输入和输出类型,同时提供与基类相同的行为。

背景:我想处理电压和温度样本。100 个电压样本形成一个电压数据集。100 个温度样本形成一个 TemperatureDataset。多个 VoltageDataset 形成一个 VoltageDataCluster。温度也一样。数据集的处理取决于它们的物理量。为了确保电压相关处理不能应用于温度样本,我想添加类型提示。

因此,如果有一种方法可以定义 VoltageDataClustes 方法 append_dataset 仅允许将 VoltageDataset 作为输入类型,我会很好。温度也一样。

有没有办法在不复制和粘贴的情况下实现这种行为?

谢谢!尼克拉斯