热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pythonvector初始化_Python中的内置数据类

前言在Python3.7及以上版本中,增加了一个dataclasses标准库,它主要用来做数据的容器,同时它还为开发人员预制了标准方法&#

前言

Python3.7及以上版本中,增加了一个dataclasses标准库,它主要用来做数据的容器,同时它还为开发人员预制了标准方法,并简化了类的创建过程,在这篇文章中,我们来研究一下这个标准库。

我们的第一个数据类

让我们先来创建一个数据类,它是空间坐标系中点的三维坐标(x,y,z),这可以直接利用dataclasses中的@dataclass描述符来实现:

from dataclasses import dataclass@dataclassclass Coordinate: x: int y: int z: int请注意上述类中的写法,如果有熟悉go语言的同学应该会对这种写法不陌生,但在Python中,这种写法显得比较另类,因为Python本身是动态语言,其变量的类型可以在程序执行的过程中发生变化,但这个类里面的写法却是将每个变量的数据类型进行了限定,这一点是与众不同的,从另一方面来看,各种语言的融合也是在悄无声息中进行,所谓取长补短吧。默认情况下,数据类已经帮我们在上述Coordinate类中实现了__init____repr____eq__等方法,因此我们可以直接使用这些方法:

a = Coordinate(3,5,4)print(a)>>> 输出:Coordinate(x=3, y=5, z=4)>>> repr(a)'Coordinate(x=3, y=5, z=4)'为数据类中的成员设置默认值比如我们来定义一个CircleArea类,其中有个属性是用来计算圆的面积,代码如下:

@dataclassclass CircleArea: r: int pi: float=3.14 @property def area(self): return self.pi * (self.r ** 2) a = CircleArea(2)a>>> 输出:CircleArea(r=2, pi=3.14)>>> 输出:12.56上述代码中,我们为类CircleArea中的成员pi设置了默认值。

类中成员值的变与不变

通常情况下,类中成员值是可以被改变的,比如上面定义的CircleArea:

a = CircleArea(2)a.r = 5a.pi = 3a.area>>> 输出:75上述代码演示了类中成员值可变的问题,可有时候我们并不想一个对象被创立后,其成员值还变化,这时候就要用到dataclass的一个参数frozen,将其设置为True即可:

@dataclass(frozen=True)class CircleArea: r: int pi: float=3.14 @property def area(self): return self.pi * (self.r ** 2) a = CircleArea(2)a.r = 5

40c58323bdfc29705c01695e7691377a.png

从上述解释器的报错信息可以看出,设定frozen=True以后,类实例的创建只能在其初始化时进行,之后的修改都是不被允许的。

数据类实例的比较

在数学中,比较大小是最常见的操作,比如我们定义一个向量类,由它产生的实例都是向量,这时如果想比较向量大小的话,一般要先给出定义,比如有两个向量A(x1,y1)B(x2,y2),如果x1>x2,那么我们就说向量A>B,如果x1==x2,那么当y1>y2时我们就说A>B,这样的比较大小逻辑在dataclasses标准库中已经帮我们实现了,唯一我们要做的是在创建用@dataclass修饰的类时,将其参数order设置为True即可:

@dataclass(order=True)class Vector: x : int y : int v1 = Vector(4,9)v2 = Vector(3,10)print(v1 > v2)>>> 输出:True上面代码的结果判定为True,这说明根据类自身的定义可知v1>v2,可是如果我们不想用上述比较向量大小的定义,想用向量本身的大小,即用向量中各分量平方和的平方根来比较大小时该如何做呢?此时要用到一个dataclass中内置的__post_init__来定义,同时所定义的大小变量要用field来限定,具体代码如下:

from dataclasses import dataclass, field@dataclass(order=True)class Vector: vectorlen : float = field(init=False) x : int y : int def __post_init__(self): self.vectorlen = (self.x ** 2 + self.y ** 2) ** 0.5 v1 = Vector(9,12)v2 = Vector(5,12)print(v1)print(v2)print(v1>v2)>>> 输出:Vector(vectorlen=15.0, x=9, y=12)Vector(vectorlen=13.0, x=5, y=12)True将类实例转换为字典或元组我们可以直接将由@dataclass修饰的类转换为一个字典或一个元组,所用到的函数也很简单,分别是:asdictastuple:

from dataclasses import dataclass, asdict, astuple@dataclass()class Vector: x : int y : int z : int v = Vector(2,4,9)print(asdict(v))print(astuple(v))>>> 输出:{'x': 2, 'y': 4, 'z': 9}(2, 4, 9)关于类的继承用@dataclass修饰的类也同样具备普通继承的属性,比如:

@dataclassclass Person: name : str sex : str @dataclassclass Programmer(Person): lang : str p1 = Programmer("张三", "男", "Python")print(p1)>>> 输出:Programmer(name='张三', sex='男', lang='Python')但是如果我们提前给某个父类中的成员设置默认值后,再调用子类创建实例就会报错,比如:

@dataclassclass Person: name : str sex : str = "男" @dataclassclass Programmer(Person): lang : str p1 = Programmer("张三", "男", "Python")print(p1)

a1143043b8683f6a9e6d082fbb6e415f.png

以上两段代码唯一不同的地方,在于第二段代码中对父类Person中的成员sex提前指定了默认值,这就导致了错误,这是因为:当我们在调用子类实例化对象时,它事实上是这样调用初始化函数的:

def __init__(name:str, sex:str="男", lang:str): ...从这个函数形式上来看,第二个参数给出了默认值,但第三个参数却没有,这样不符合函数的形式化定义,因此,在父类中指定了某个成员为默认值后,子类中同样要为所有成员指定默认值,修改代码如下:

@dataclassclass Person: name : str sex : str = "男" @dataclassclass Programmer(Person): lang : str = "" p1 = Programmer("张三", "男", "Python")print(p1)>>> 输出:Programmer(name='张三', sex='男', lang='Python')小结这一篇文章中介绍了Python的标准库dataclasses,它内置了一些标准化的方式,对于数学方面的处理显得很方便,现在此简单介绍,以便于备忘和有需要的同学借鉴。




推荐阅读
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
author-avatar
wtc21232
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有