问题标签 [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.
python - 不同版本的类在 python 中的最佳实现,都具有相同的方法,这些方法将根据环境变量进行选择?
所以我有很多函数,每个函数都对服务进行 api 调用,进行一些处理并返回一些东西。但是,其中有几个服务是相似的,我基本上需要为每个服务创建具有所有相同功能的类,但根据环境变量的值,在运行时只会使用这些类中的一个。
在 python 中执行此操作的最佳方法是什么?
我可以使用 ABC 创建一个抽象基类,确保所有这些类都实现相同的功能。
但是,我正在努力解决的是如何在其余的 python 代码中获得该类。
我是否应该创建另一个具有所有这些相同功能的类,但获得这些子类中的正确一个并将所有函数调用推迟到该类?
或者,还有更好的方法?
c++ - 如何要求用户在我的代码中输入数字以打印结果
我如何要求用户输入这两个数字并在此处以 C++ 打印结果?拜托我需要你的帮忙。我是 C++ 新手。
python - 如何使用 Pydantic 创建 Python ABC 接口模式
我正在使用抽象基类(称为策略模式)实现 Python 接口。我希望能够用 Pydantic 做到这一点。
如果没有 Pydantic,我会使用如下属性:
这样,如果我要实现另一个类,比如
那么界面就会报错。这有助于约束任何继承自PersonEntity
.
但是,我想将此信息吐到 FastAPI 响应对象中。如果不找出某种序列化程序来获取每个属性字段的所有值,以及只是属性字段(我正在努力做到这一点),我就无法做到这一点。
我宁愿使用 Pydantic。在这种情况下,我不需要属性,我可以简单地做:
这些将以我需要的方式序列化,但我失去了接口功能,因为现在我没有属性,因此无法使用 @abstractproperty
.
所以如果我要实施
没有错误,因为 pydantic 允许这样做。
(顺便说一句,在这些示例中,我不确定是否从子类中的 BaseModel 继承。)
有什么方法可以约束 Pydantic 模型给我我需要的接口行为,当引入一个不包含在 ABCPersonEntity
类中的字段时抛出错误?
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 渲染例程。我还注释掉了渲染函数的内容,因此我只能怀疑特定的函数调用。
python - 创建新的基类实例时初始化子类实例
概括
TLDR:是否有可能调用/实例化基类实际上返回一个初始化的子类实例?
例子
考虑这个Animal
基类Cat
和Dog
子类:
这按预期工作:
现在,我想扩展它,以便调用Animal
类应该返回它的一个子类,即第一个不会引发错误的子类。
所以,我想c3 = Animal(0.7)
返回一个Cat
实例。
试图
我知道在实例化基类时如何从子类返回一个实例,但前提是它可以在运行之前__init__
确定,它是哪一个。
所以,这行不通……
...因为ValueError
只有在实例已经创建并返回时才会引发:
有没有办法做到这一点?
当前的解决方法
这可行,但与类分离,并且感觉集成度差/高度耦合。
编辑:
- 感谢@chepner 的
__subclasses__()
建议;我已将其整合到问题中。
python - Python:为不同类型实现基类
我想知道是否有办法为不同类型实现基类的子类。每个子类应具有单独的输入和输出类型,同时提供与基类相同的行为。
背景:我想处理电压和温度样本。100 个电压样本形成一个电压数据集。100 个温度样本形成一个 TemperatureDataset。多个 VoltageDataset 形成一个 VoltageDataCluster。温度也一样。数据集的处理取决于它们的物理量。为了确保电压相关处理不能应用于温度样本,我想添加类型提示。
因此,如果有一种方法可以定义 VoltageDataClustes 方法 append_dataset 仅允许将 VoltageDataset 作为输入类型,我会很好。温度也一样。
有没有办法在不复制和粘贴的情况下实现这种行为?
谢谢!尼克拉斯