Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Python中设计具有正确类型注释的共享子类型功能

在Python中设计具有正确类型注释的共享子类型功能
EN

Software Engineering用户
提问于 2022-01-06 23:58:34
回答 1查看 98关注 0票数 3

为了说明这个问题,我定义了一个PositiveNumber类,它是一个Number类的子类。由于Python不支持类型转换,所以我将from_number定义为一种方便的方法,可以用来将一个实例强制转换到另一个实例。这个方法对于Number类的所有子类型都是通用的,所以我将它放入父类中。

代码语言:javascript
运行
AI代码解释
复制
from __future__ import annotations

from typing import Any, Dict


class Number:
    def __init__(self, value: float, *args, **kwargs) -> None:
        self.value = value

    @classmethod
    def from_number(cls, other: Number) -> Number:
        return cls(**other.dict())

    def dict(self) -> Dict[str, Any]:
        return {
            "value": self.value
        }


class PositiveNumber(Number):
    def __init__(self, value: float, *args, **kwargs) -> None:
        if value <= 0:
            raise ValueError("Value must be a positive float value.")
        super().__init__(value)

    @property
    def is_positive(self) -> bool:
        return True
代码语言:javascript
运行
AI代码解释
复制
x = Number(1001) # this could be a positive number

# instead of writing this
y = PositiveNumber(value=x.value)

# I would like to be able to do this
y = PositiveNumber.from_number(x)

type(y)
# >> <class '__main__.PositiveNumber'>

正如我们所看到的,y是PositiveNumber的一个实例,正如我们所期望的,但它被注释为Number的一个实例。

为了避免这种情况,我必须在每个子类中覆盖from_number,以更正输出注释。

代码语言:javascript
运行
AI代码解释
复制
class PositiveNumber(Number):
    def __init__(self, value: float, *args, **kwargs) -> None:
        if value <= 0:
            raise ValueError("Value must be a positive float value.")
        super().__init__(value)

    @classmethod
    def from_number(cls, other: Number) -> PositiveNumber: #overridden
        return super().from_number(other)

    @property
    def is_positive(self) -> bool:
        return True

我的想法是,from_number应该是一个接口方法,但是接下来我必须在每个子类型中实现相同的功能,这将是很乏味的,因为代码大部分是相同的。

是否有一种更优雅的方式来做到这一点,或者这是一个完全糟糕的设计?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2022-01-07 01:27:19

在类型理论中,你需要的概念称为MyTypeSelfType。正如您所发现的,这是一个非常有用的特性,有两个主要的用例(clone / copy / dup方法和工厂/解析/反序列化方法),而且我总是感到惊讶的是,几乎没有主流类型系统具有这个特性。我脑子里唯一的例外是TypeScript生锈

[注意: Scala也有一个名为自型的概念,但这是另一回事:它允许您将类型分配给this,而不是引用this类型。它还提供了单例类型,允许您引用仅由特定对象居住的类型,包括类似于this.type的内容。但是这太严格了:这指的是一个类型,其唯一的实例是当前的this,而不是与this具有相同类型的任何实例。]

对于PythonMyPy,您既幸运又不走运:好消息是Python有一个PEP 673中的自定义规范草案

代码语言:javascript
运行
AI代码解释
复制
from typing import Any, Dict, Self


class Number:
    @classmethod
    def from_number(cls, other: Number) -> Self:
        return cls(**other.dict())

坏消息是,它仍然是一个草案,计划在Python3.11中实现,目前它是计划于2022年-第四季度发布。它已经在皮赖特MyPy的叉子中实现了,但是它还没有在typing中实现(但是有一个拉请求),也没有在MyPy的官方版本中实现。

这意味着,目前您必须使用Pyright (然而,这是没有意义的,因为您的代码将静态地键入check,然后在运行时由于缺少导入而失败)或解决办法记录在PEP 673中.

代码语言:javascript
运行
AI代码解释
复制
from typing import Any, Dict, TypeVar


Self = TypeVar("Self", bound="Number")

class Number:
    @classmethod
    def from_number(cls: type[Self], other: Number) -> Self:
        return cls(**other.dict())
票数 7
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/435804

复制
相关文章
在Keras中如何对超参数进行调优?
由于没有一个成熟的理论来解释神经网络,所以配置神经网络通常是困难的,经常被同学们调侃为“炼丹”。
花落花飞去
2018/02/05
16.9K2
在Keras中如何对超参数进行调优?
在 Linux/Mac 下为Python函数添加超时时间
我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做timeout,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常。(当然存在特殊情况timeout 会失效,请看Timeouts and cancellation for humans*[1] 这篇文章中作者的举例,我们不考虑这种特殊情况)。
青南
2020/02/26
1.1K0
在 Linux/Mac 下为Python函数添加超时时间
手把手教你在本机安装spark
最近由于一直work from home节省了很多上下班路上的时间,加上今天的LeetCode的文章篇幅较小,所以抽出了点时间加更了一篇,和大家分享一下最近在学习的spark相关的内容。看在我这么拼的份上,求各位老爷赏个转发。。。
TechFlow-承志
2020/04/14
4.4K0
Jira Epic在完成状态时,如何让Epic在Scrum面板待办事项中不显示?
遇到的问题:Epic在完成状态时,仍旧在Scrum面板待办事项中显示,需要手动将其【标记完成】 而想要的效果是:Epic到完成状态时,Epic自动标记完成
donghui
2019/04/19
2.9K0
Jira Epic在完成状态时,如何让Epic在Scrum面板待办事项中不显示?
日本机器人“赢在技术输在商业” 谁之过?
据《金融时报》网站报道,去年当谷歌收购由2位日本机器人工程师创办的一家微型新创公司Schaft时,让人们对日本面临的威胁突然有了新的认识。包括苹果和亚马逊等新科技公司对机器人技术日益感兴趣。 时
机器人网
2018/04/13
7070
日本机器人“赢在技术输在商业” 谁之过?
在Centos下对Tornado的性能进行测试
    在之前的一篇文章中,我们在1g1核的惨淡硬件环境下,对 uwsgi + django 和 gunicorn+ django 的后端服务进行性能测试,得出结论单台django在简单读库操作下只能抗住大约200左右的并发:在Centos下使用Siege对Django服务进行压力测试
用户9127725
2022/08/08
7630
在Centos下对Tornado的性能进行测试
PECVD等离子增强化学沉积技术
纳米涂层(what)是一种功能性、柔性纳米级厚度的薄膜,具有疏水疏油特性。原理(how)在低温真空腔体内,等离子激发反应气体,在基材(被保护的PCBA)表面开启化学反应,生成纳米级厚度的网状保护膜(防泼溅、防潮、疏水、疏油,防腐蚀、防盐雾、防汗液)。气体沉积工艺保证了全面覆盖(内外,缝隙),均匀性,批量处理,牢固性。
用户10405156
2023/03/06
3210
如何通过VPC在本机搭建局域网
前几天在家里测试一个基于WS-AT的分布式应用,但是连接公司网络的VPN出现了问题,不得不采用VPC在本机搭建一个局域网。虽然以前也做过这样的尝试,可能是很久没有弄过了,一些细节记不清了,所以也折腾了好一阵子。在这里,我特意写一篇文章来介绍基于VPC搭建局域网的整个步骤,没有什么技术含量,只当给具有相同需要的朋友多一个参考。 我现在的Host Machine为Windows 7 Ultimate (X64) ,Virtual Machine为Windows Server 2008 (X86),都是现成的。本
蒋金楠
2018/01/16
2.4K0
如何通过VPC在本机搭建局域网
测试人员在技术面试时的注意事项
过完年了,有很多兄弟姐妹们开始春心萌动了,额不对,是物色新工作机会了,所以小编在此整理了一些面试相关的文章,希望对大家有所帮助!
张树臣
2019/03/04
6330
测试人员在技术面试时的注意事项
在使用Qt5.8完成程序动态语言切换时遇到的问题
因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文件,再通过网上介绍的方式,在 main函数中使用 installTranslator,即可让程序在启动时自动判断语言环境,加载相应语言。 至此,静态语言切换已经完成,下面要做的是动态切换(即不需要重启软件)。 1.首先,令语言能够切换的 GUI组件用的是 QComboBox,信号是 currentIndexChanged,在于这个
用户1653704
2018/06/07
1.7K0
对测试技术在团队的一个简单思考
测试技术带来的是PPT工具还是紧贴业务,服务于业务的小工具,小脚本,PPT工具大部分可能带来的是高大尚的平台,无效不实用,投入成本高,主要用于晋升和给自己镀金的作用;而小脚本,小工具不高大尚,作用大,感觉替代性高,一直在业务线上,没有发展前途,对以后前途和职业发展来讲是阻碍;也许可能是跪久了,站不起来了,迷路了,不知道 南橘北枳这个成语吗?所以测试技术要符合自己的团队和业务进行发展才是最实在的,太虚了,经济不景气,裁的就是这些;
厦门-安仔
2023/03/07
2320
对测试技术在团队的一个简单思考
在Centos下使用Siege对Django服务进行压力测试
    Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续请求的压力测试。今天我们就使用Siege来对Django进行一次压力测试,看看单台Django服务到底能抗住多少的并发数。
用户9127725
2022/08/08
1.6K0
在Centos下使用Siege对Django服务进行压力测试
微信小程序----wx.getLocation(OBJECT) API在iOS关闭本机定位时,获取定位失败
问题 在做一个小程序时,进入首页需要获取用户的当前位置经纬度,然后去服务器查询当前位置周边的网吧。在安卓关闭定位设置时,wx.getLocation(OBJECT) API依然能够获取当前位置的经纬度;但是iOS如果关闭定位设置,wx.getLocation(OBJECT) API就会失败! 解决办法 微信小程序社区解决办法 根据官网解决的实际用法 Page({ onShow(){ // 获取当前地址 wx.getLocation({
Rattenking
2021/02/01
1.4K0
CPU 摸鱼时,在干嘛?
假设你正在用计算机浏览网页,当网页加载完成后你开始阅读,此时你没有移动鼠标,没有敲击键盘,也没有网络通信,那么你的计算机此时在干嘛?
小林coding
2021/03/30
7820
CPU 摸鱼时,在干嘛?
在定义adt时_ScriptableObject
Mutators 变值器(改变对象属性的方法) 通常范围void,如果返回void,则必然意味着它改变了某些对象的内部状态,也可能范围非空类型(如容器类的put、add方法)
全栈程序员站长
2022/10/02
3060
curl在CDN排障中的常见用法
-I Show document info only 只展示headers,发起HEAD请求 -o Write output to file instead of stdout 保存到本地 -x 用这个option可以指定http访问所使用的proxy服务器及其端口 -v Make the operation more talkative 可以显示一次http通信的整个过程,包括端口连接和http -H Custom header to pass to server 添加header -A/–user-agent [string] 指定UA访问 -e, --referer URL 指定referer --resolve HOST:PORT:ADDRESS Force resolve of HOST:PORT to ADDRESS -X -d 这里的X是大写,-X POST发起POST请求
邪恶の大灰
2019/04/29
3.6K0
点击加载更多

相似问题

goBack屏在排毒测试中的应用

60

排毒只测试飞溅屏

10

排毒测试还没有完成

10

在反应本机溅屏中显示ActivityIndicator 5秒

110

如何使用react本机-i18n在排毒[反应-本机]

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档