问题标签 [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 投票
0 回答
52 浏览

python - 抽象基类:如何在抽象方法的独特实现之后添加标准动作?

我想减少实现FooBC数据类的抽象基类所需的样板代码。ABC需要做什么:

  • 每个继承者的创建都与(例如)浮点数略有不同,这就是为什么每个继承者都需要实现from_float()类方法的原因。
  • 所有继承人都应该保存float_value / 2. 我怎样才能自动化呢?目前,用户被迫float_value / 2在每个实现中粘贴from_float().

现在,这是我的代码:

我很想将 Inheritor 样板减少到:

如何升级 FooBC 类以在调用float_value/2时自动保存from_float

我想这样的事情会很棒:

0 投票
0 回答
15 浏览

python - python中抽象基类的子类初始化时需要属性

我正在处理python中的一些代码,这些代码需要某些抽象基类的子类对象来实现属性。根据本网站上的其他帖子和建议以及其他流行方法是使用@propertyABC 中的装饰器。但是,此方法不需要实际对象在初始化时具有该属性,只需@property在子类中实现该方法即可。

在上面的代码中,Foo可以在方法someAttribute存在时初始化类,但是在调用时会抛出属性错误。如果这发生在一些计算量大的代码的末尾,这可能是一个问题,如果早点检测到,这本可以避免。

输出

如果使用了装饰器,则Protocol类 fromtyping可以检查对象中的属性,但是如果显式继承子类,则这不起作用,仅用于隐式子类型化。isinstance@runtime_checkable

有没有更好的方法来检查子类是否履行了包含指定属性的合同?

0 投票
1 回答
391 浏览

python - 派生自抽象基类的类实例的 Python 类型注释

假设MembershipClass已经创建了一个抽象基类。多个类派生自抽象基类,例如 ,FirstClassSecondClass

我希望在一个函数中使用类型注释,该函数接受任何从MembershipClass. 如果有少量派生类(比如 2),这应该有效:

有没有办法创建一个类型提示,membership_obj它本质上说它的类型是任何派生的类,MembershipClass而不必在类型注释中指定每个可能的派生类?

我已经看到了两种可能的解决方案:

  1. 类型变量
  1. 直接使用ABC

这两种方法都可以接受吗?

0 投票
1 回答
103 浏览

python - 是否可以将抽象基类用作带有 dict 子类的 mixin?

TL;DR:有兴趣了解是否可以按照我的意愿使用抽象基类作为混合,或者我的方法是否从根本上被误导。

我有一个我一直在做的 Flask 项目。作为我项目的一部分,我实现了一个RememberingDict类。它是 的一个简单的子类dict,添加了一些额外的功能:它会记住它的创建时间,它知道如何将自己腌制/保存到磁盘,并且它知道如何从磁盘打开/取消腌制自己:

该代码在本地开发服务器上非常适合我的目的,所以一切都很好,但是(由于这里没有必要进入的原因),在 Google App Engine 上部署它时它不起作用,所以出于这些目的,我设计了这个替代实现:

现在,这两种实现都可以正常工作。然而,我想保留它们——第一个对开发很有用——但令人讨厌的是,两者之间显然有相当多的重复。它们的__init__()功能是相同的;它们都有一个to_disk()将实例保存到文件并返回的方法None;并且它们都有一个from_disk()类方法,该方法返回一个已保存到某个磁盘的类的实例。

理想情况下,我希望它们都继承自一个基类,从而传递给它们各种类似的dict能力,并指定必须重写to_disk()andfrom_disk()方法以提供完整的实现。

这感觉像是一个ABCs应该能够解决的问题。我尝试了以下方法:

但是,将ABC用作 mixin(而不是作为唯一的基类)似乎会弄乱@abstractmethod装饰器,因此如果继承的类无法实现所需的抽象方法,则不会再引发异常。

理想情况下,我希望我的基类继承标准 Python 的所有功能dict,但还指定必须在继承的类中实现某些方法才能实例化实例。

我正在尝试做的事情是可能的,还是我的方法从根本上被误导了?

(顺便说一句:我对ABCs 的工作方式更感兴趣,而不是缓存 Web 应用程序数据结构的最佳方法等。我确信可能有更好的缓存数据方法,但这是我的第一个 Flask 项目,我的方式目前对我来说很有效。)

0 投票
1 回答
157 浏览

python - 在 post_init 中创建的数据类的属性的访问类型提示

蟒蛇:3.7+

我有一个数据类和它的子类,如下所示:

我可以得到类型提示databaseusermessage使用typing.get_type_hints(Command). 如何获得类型提示user_id

一种解决方法是将 user.uid 和 user.name 作为单独的参数传递给 Command,但是当 User 对象具有许多有用的属性时,这并不实用。

我相信它首先不起作用的原因是因为 init 在运行时被调用,这就是类型检查不考虑这些属性的原因。一种可能的解决方案是解析类的 ast,但我不确定这是否推荐和足够通用。如果是,将不胜感激一个工作示例。

0 投票
1 回答
92 浏览

python - 从抽象类继承时如何避免重复参数定义?

我有一个用 Python 编写的抽象类:

它有一个带有很多参数的抽象方法。我知道,我知道,将大量参数传递给函数不是一个好习惯,但现在这与我的问题无关。

现在我想编写另一个继承自 AbstractClass 的类。而且我必须手动复制所有参数及其来自抽象类的类型提示。

当我有几个抽象方法和几个类继承自它时,它不仅很麻烦,而且pylint对代码重复感到尖叫。而且,老实说,我同意他的看法。

显然必须有更好的方法。是吗?

0 投票
1 回答
29 浏览

python - 使用实现级方法的抽象方法

我正在我的电子商务网站中实现一些用于调整价格的类:每个类代表一个不同的定价调整策略,并且属于一个 AbstractBaseClass,它规定了两种方法: transform_pricetransform_array.

由于transform_array只是该transform_price方法的列表理解(当然,这是特定于实现的),我希望有某种方法可以完全抽象该方法,使其仍然执行特定于实现的方法transform_price

例如,我希望能够定义一个 PricingModel:

虽然仍然能够访问抽象类中定义的 transform_price_array 方法:

0 投票
2 回答
718 浏览

python - 如何让抽象数据类传递 mypy?

mypy v0.910 拒绝 Python 3.9 中的抽象数据类。这是最小的可重现示例:

这是错误消息:

如何让此代码通过mypy


笔记

我从mypy 问题 #5374中得知这是mypy中的一个错误,于 2018 年首次发现,但仍未得到纠正。不过,我认为人们必须将mypy与抽象数据类一起使用,因此必须有一种解决方法或正确的方法来定义或注释该类。推荐什么?

错误消息的基础似乎是mypy假设Type可以实例化任何类型的对象,但不能实例化抽象类。这似乎是错误,因为Type它被定义为一个类对象,不一定是一个具体的类对象(即可以实例化的对象)。

添加# type: ignore到包含的行class Liquid不会阻止错误消息。由于代码中不包含Type[Liquid],我想它一定是在生成的代码中dataclassType在 Python 3.9 中已弃用,但显然dataclass代码生成器仍会生成它。

0 投票
1 回答
121 浏览

python - 为什么 mypy 不理解这个对象实例化?

我正在尝试定义一个将另一个类作为属性_model并实例化该类的对象的类。

我认为self._model(**attrs)返回 , 的实例应该很明显Item,因为_model它被显式声明为Type[Item]并且attrs被声明为Dict[str, Any]

但我得到的mypy 0.910是:

我究竟做错了什么?

0 投票
1 回答
90 浏览

c++ - 抽象基类的 C++ 模板特化