问题标签 [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 - 抽象基类:如何在抽象方法的独特实现之后添加标准动作?
我想减少实现FooBC
数据类的抽象基类所需的样板代码。ABC需要做什么:
- 每个继承者的创建都与(例如)浮点数略有不同,这就是为什么每个继承者都需要实现
from_float()
类方法的原因。 - 但所有继承人都应该保存
float_value / 2
. 我怎样才能自动化呢?目前,用户被迫float_value / 2
在每个实现中粘贴from_float()
.
现在,这是我的代码:
我很想将 Inheritor 样板减少到:
如何升级 FooBC 类以在调用float_value/2
时自动保存from_float
?
我想这样的事情会很棒:
python - python中抽象基类的子类初始化时需要属性
我正在处理python中的一些代码,这些代码需要某些抽象基类的子类对象来实现属性。根据本网站上的其他帖子和建议以及其他流行方法是使用@property
ABC 中的装饰器。但是,此方法不需要实际对象在初始化时具有该属性,只需@property
在子类中实现该方法即可。
在上面的代码中,Foo
可以在方法someAttribute
存在时初始化类,但是在调用时会抛出属性错误。如果这发生在一些计算量大的代码的末尾,这可能是一个问题,如果早点检测到,这本可以避免。
输出
如果使用了装饰器,则Protocol
类 fromtyping
可以检查对象中的属性,但是如果显式继承子类,则这不起作用,仅用于隐式子类型化。isinstance
@runtime_checkable
有没有更好的方法来检查子类是否履行了包含指定属性的合同?
python - 是否可以将抽象基类用作带有 dict 子类的 mixin?
TL;DR:有兴趣了解是否可以按照我的意愿使用抽象基类作为混合,或者我的方法是否从根本上被误导。
我有一个我一直在做的 Flask 项目。作为我项目的一部分,我实现了一个RememberingDict
类。它是 的一个简单的子类dict
,添加了一些额外的功能:它会记住它的创建时间,它知道如何将自己腌制/保存到磁盘,并且它知道如何从磁盘打开/取消腌制自己:
该代码在本地开发服务器上非常适合我的目的,所以一切都很好,但是(由于这里没有必要进入的原因),在 Google App Engine 上部署它时它不起作用,所以出于这些目的,我设计了这个替代实现:
现在,这两种实现都可以正常工作。然而,我想保留它们——第一个对开发很有用——但令人讨厌的是,两者之间显然有相当多的重复。它们的__init__()
功能是相同的;它们都有一个to_disk()
将实例保存到文件并返回的方法None
;并且它们都有一个from_disk()
类方法,该方法返回一个已保存到某个磁盘的类的实例。
理想情况下,我希望它们都继承自一个基类,从而传递给它们各种类似的dict
能力,并指定必须重写to_disk()
andfrom_disk()
方法以提供完整的实现。
这感觉像是一个ABC
s应该能够解决的问题。我尝试了以下方法:
但是,将ABC
用作 mixin(而不是作为唯一的基类)似乎会弄乱@abstractmethod
装饰器,因此如果继承的类无法实现所需的抽象方法,则不会再引发异常。
理想情况下,我希望我的基类继承标准 Python 的所有功能dict
,但还指定必须在继承的类中实现某些方法才能实例化实例。
我正在尝试做的事情是可能的,还是我的方法从根本上被误导了?
(顺便说一句:我对ABC
s 的工作方式更感兴趣,而不是缓存 Web 应用程序数据结构的最佳方法等。我确信可能有更好的缓存数据方法,但这是我的第一个 Flask 项目,我的方式目前对我来说很有效。)
python - 在 post_init 中创建的数据类的属性的访问类型提示
蟒蛇:3.7+
我有一个数据类和它的子类,如下所示:
我可以得到类型提示database
,user
并message
使用typing.get_type_hints(Command)
. 如何获得类型提示user_id
?
一种解决方法是将 user.uid 和 user.name 作为单独的参数传递给 Command,但是当 User 对象具有许多有用的属性时,这并不实用。
我相信它首先不起作用的原因是因为 init 在运行时被调用,这就是类型检查不考虑这些属性的原因。一种可能的解决方案是解析类的 ast,但我不确定这是否推荐和足够通用。如果是,将不胜感激一个工作示例。
python - 从抽象类继承时如何避免重复参数定义?
我有一个用 Python 编写的抽象类:
它有一个带有很多参数的抽象方法。我知道,我知道,将大量参数传递给函数不是一个好习惯,但现在这与我的问题无关。
现在我想编写另一个继承自 AbstractClass 的类。而且我必须手动复制所有参数及其来自抽象类的类型提示。
当我有几个抽象方法和几个类继承自它时,它不仅很麻烦,而且pylint
对代码重复感到尖叫。而且,老实说,我同意他的看法。
显然必须有更好的方法。是吗?
python - 使用实现级方法的抽象方法
我正在我的电子商务网站中实现一些用于调整价格的类:每个类代表一个不同的定价调整策略,并且属于一个 AbstractBaseClass,它规定了两种方法:
transform_price
和transform_array
.
由于transform_array
只是该transform_price
方法的列表理解(当然,这是特定于实现的),我希望有某种方法可以完全抽象该方法,使其仍然执行特定于实现的方法transform_price
。
例如,我希望能够定义一个 PricingModel:
虽然仍然能够访问抽象类中定义的 transform_price_array 方法:
python - 如何让抽象数据类传递 mypy?
mypy v0.910 拒绝 Python 3.9 中的抽象数据类。这是最小的可重现示例:
这是错误消息:
如何让此代码通过mypy?
笔记
我从mypy 问题 #5374中得知这是mypy中的一个错误,于 2018 年首次发现,但仍未得到纠正。不过,我认为人们必须将mypy与抽象数据类一起使用,因此必须有一种解决方法或正确的方法来定义或注释该类。推荐什么?
错误消息的基础似乎是mypy假设Type
可以实例化任何类型的对象,但不能实例化抽象类。这似乎是错误,因为Type
它被定义为一个类对象,不一定是一个具体的类对象(即可以实例化的对象)。
添加# type: ignore
到包含的行class Liquid
不会阻止错误消息。由于代码中不包含Type[Liquid]
,我想它一定是在生成的代码中dataclass
。Type
在 Python 3.9 中已弃用,但显然dataclass
代码生成器仍会生成它。
python - 为什么 mypy 不理解这个对象实例化?
我正在尝试定义一个将另一个类作为属性_model
并实例化该类的对象的类。
我认为self._model(**attrs)
返回 , 的实例应该很明显Item
,因为_model
它被显式声明为Type[Item]
并且attrs
被声明为Dict[str, Any]
。
但我得到的mypy 0.910
是:
我究竟做错了什么?