首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在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

复制
相关文章
Golang计算两个经度和纬度之间的距离
Go语言计算两个经度和纬度之间的距离 package main import ( "fmt" "math" ) func main() { lat1 := 29.490295 lng1 := 106.486654 lat2 := 29.615467 lng2 := 106.581515 fmt.Println(EarthDistance(lat1, lng1, lat2, lng2)) } func EarthDistance(lat1, lng1, lat2, lng
大师级码师
2021/11/02
2.6K0
【Java AWT 图形界面编程】经度 Longitude 、纬度 Latitude 计算 ( 经度、纬度概念 | 根据经纬度计算距离 )
经度 Longitude , 本初子午线 位置 为 0 度经线 , 相当于水平 x 轴 的坐标 , 经度的取值范围 -180 度 ~ +180 度 ;
韩曙亮
2023/03/25
7900
【Java AWT 图形界面编程】经度 Longitude 、纬度 Latitude 计算 ( 经度、纬度概念 | 根据经纬度计算距离 )
已知两点的经度和纬度,计算两点间的距离(php,javascript)
php代码:转载  http://www.cnblogs.com/caichenghui/p/5977431.html
lin_zone
2018/08/15
8000
671. 循环单词重复加标记
The words are same rotate words if rotate the word to the right by loop, and get another. Count how many different rotate word sets in dictionary.
和蔼的zhxing
2018/09/04
5660
HTML布局标记和列表标记
首先要介绍的布局标记是div标记,div可以做网页的层也可以做网页的分区。当div做网页的层时可以实现漂浮在网页上的效果,就像我们经常可以在网站里看见的那些漂浮广告。div做网页的分区时,则是可以布置网页的格局,把一个网页分为多个模块,由这些模块结构来构建出一个网页。
端碗吹水
2020/09/23
4.2K0
HTML布局标记和列表标记
【系统设计】邻近服务
在本文中,我们将设计一个邻近服务,用来发现用户附近的地方,比如餐馆,酒店,商场等。
全球技术精选
2022/09/05
1.1K0
【系统设计】邻近服务
如何使用AngularJS和PHP为任何位置生成短而独特的数字地址
邮政地址通常很长,有时很难记住。在许多情况下,需要较短的地址。例如,能够发送仅由几个字符组成的短地址可以确保更快地提供紧急救护车服务。Pieter Geelen和Harold Goddijn 于2001年开发了Mapcode系统,以便为世界上任何物理地址创建简短地址。
谢鸢
2018/11/05
13.3K0
CA1069:枚举不得具有重复值
每个枚举成员都应具有唯一的常数值,或者为其显式分配枚举中的前一个成员以指示共享值的明确意图。 例如:
用户4268038
2022/01/11
6390
【GIS - 地理信息系统】经纬度计算 ( 经度、纬度概念 | 地球周长计算 | 地球经线周长计算 | 经纬度相关计算 | 经纬度坐标距离计算公式 | 经纬度与实际距离换算 | 相关代码实现 )
经度 Longitude , 本初子午线 位置 为 0 度经线 , 相当于水平 x 轴 的坐标 , 经度的取值范围 -180 度 ~ +180 度 ;
韩曙亮
2023/10/11
6.8K0
【GIS - 地理信息系统】经纬度计算 ( 经度、纬度概念 | 地球周长计算 | 地球经线周长计算 | 经纬度相关计算 | 经纬度坐标距离计算公式 | 经纬度与实际距离换算 | 相关代码实现 )
Google新动作:处理重复内容
不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。 这几天Google也有大动作,正在针对“重复内容”进行清理并处罚,其实,这个跟百度的飓风算法有点像,只不过“飓风算法”只是针对恶意采集内容来源的网站进行处罚。 至于谷歌这个针对“重复内容”的动作,今天我来跟大家详细的讲解下,相信百度后期也会针对这方面进行推出新的算法。 — — 及时当勉励,岁月不待人。 SEO顽疾:处理重复内容 “重复内容”在很早之前就有
黄伟SEO
2018/05/17
1.4K0
Google如何识别重复内容的主要版本
识别重复内容的主要版本 我们知道Google不会惩罚Web上的重复内容,但是它可能会尝试确定与同一页面的其他版本相比,它更喜欢哪个版本。
海拥
2021/08/23
1.6K0
是什么能让 APP 快速精准定位到我们的位置?
本文作者:smallyang,腾讯 IEG 开发工程师 什么是geohash?它的原理是什么?它帮助我们解决了哪些痛点,本文为你娓娓道来。 本文包含以下内容,阅读完需要约10分钟: 我们日常生活中遇到哪些定位的场景 简单复习一下经纬度 geohash原理解析 geohash存在的边界问题 如何解决边界问题 计算两点距离的计算 geohash 在redis中的实现 我们日常生活中遇到哪些定位的场景 我们上下班经常会用APP打车和共享单车,下面2张图,应该都很熟悉,打开定位,查找我附近的车,那么,这
腾讯技术工程官方号
2019/11/09
1.6K0
是什么能让 APP 快速精准定位到我们的位置?
揭秘!是什么能让APP快速精准定位?
导语 | 我们在使用APP时,是什么能让它快速精准定位我们的具体位置?答案就是geohash。那究竟什么是geohash呢?它的原理是什么?它又帮助我们解决了哪些痛点,本文帮你逐一击破,且听我娓娓道来。 一、日常生活中遇到哪些定位的场景 我们上下班经常会用APP打车和共享单车,下图应该都很熟悉,打开定位,查找我附近的车,那么,这个是怎么实现的呢? 我脑海中第一个实现方式是:实时上报经纬度。在数据库里,把经纬度都标记为索引,通过查找对比经纬度的值,来找到附近1km的车子,但是这种做法第一是索引比较多
腾讯云开发者
2021/09/03
1.5K0
google maps api_js调用谷歌浏览器接口
1. 使用谷歌地图 API 的第一步就是要注册一个 API 密钥,需要注重一下两点:
全栈程序员站长
2022/09/20
5.8K0
如何通过经纬度获取地址信息?
摘要 Google Maps API Web Services,是一个为您的地图应用程序提供地理数据的 Google 服务的 HTTP 接口集合。具体包括:Google Geocoding API、Google Directions API、Google Elevation API、Google Places API。本文将探讨如何通过Google Geocoding API服务来获取地址信息。 ----  目录 什么是网络服务? 区分地址解析与反地址解析 地址查询(反地址解析)请求 地址查询(反地址解析)
刘皓
2018/04/03
7.6K0
如何通过经纬度获取地址信息?
【Go 语言社区】HTML5 Geolocation(地理定位)-转
HTML5 Geolocation(地理定位)用于定位用户的位置。 ---- 定位用户的位置 HTML5 Geolocation API 用于获得用户的地理位置。 鉴于该特性可能侵犯用户的隐私,除非用
李海彬
2018/03/20
2.5K0
美团如何查询附近商家
我们日常电脑美团或者饿了么点外卖,附近的商家几乎都是秒回的,最简单的理解,我们可以用经纬度来计算。
三哥
2020/04/22
5.3K0
美团如何查询附近商家
只要两步,用Python将地址标记在地图上!
首先我们需要将地理位置转成经纬度这种统一格式,方便代码去识别。完成这一个需求可以使用爬虫通过在线的经纬度转换网站来实现,也可以使用一些专业的API比如百度、高德等,这里我们使用百度地图开放平台。
刘早起
2021/01/21
3.8K0
点击加载更多

相似问题

避免在google地图上加载具有相同经度和纬度的标记

42

如何快速获取Google位置标记纬度和经度

11

检查重复的纬度和经度

10

从Google中的标记获取坐标(纬度和经度)

16

在google地图中获取标记的纬度和经度

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文