如何在Python中表示一个对象
在Python中一切都是对象。如果要在Python中表示一个对象,除了定义class外还有哪些方式呢?我们今天就来盘点一下。
1.dict
字典或映射存储KV键值对,它对查找、插入和删除操作都有比较高效率。用一个dict对象可以非常容易的表示一个对象。dict的使用也很灵活,可以修改、添加或删除属性。
>>> student={'name':'jack',
'age':18,
'height':170
}
>>> student
{'name': 'jack', 'age': 18, 'height': 170}
# 查看属性
>>> student['name']
'jack'
# 添加属性
>>> student['score']=89.0
>>> student
{'name': 'jack', 'age': 18, 'height': 170, 'score': 89.0}
# 删除属性
>>> del student['height']
>>> student
{'name': 'jack', 'age': 18, 'score': 89.0}
2.tuple
tuple也可以表示一个对象,相对于dict来说,它是不可变的,一旦创建就不能随意修改。tuple也只能通过下标来访问对象的属性,因此当属性比较多时使用起来没有dict方便。
# 对象属性为name、age、height
# 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
# 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
>>> student=('jack',18,170.0)
>>> student
('jack', 18, 170.0)
>>> student[1]
18
# tuple不能修改
>>> student[2]=175.0
TypeError: 'tuple' object does not support item assignment
3.collections.namedtuple
顾名思义namedtuple就是命名元组。它是tuple数据类型的扩展,同样地一旦创建,它的元素也是不可变的。与普通元组相比命名元组可以通过“属性名”来访问元素。
>>> from collections import namedtuple
>>> Point = namedtuple('Point','x,y,z')
>>> p = Point(1,3,5)
>>> p
Point(x=1, y=3, z=5)
>>> Point = namedtuple('Point','x y z')
>>> p = Point(1,3,5)
>>> p
Point(x=1, y=3, z=5)
>>> p.x
1
>>> p.y = 3.5
AttributeError: can't set attribute
# 可以看出通过namedtuple定义对象,就是一个class类型的
>>> type(p)
<class '__main__.Point'>
对于一个简单的对象,我们使用namedtuple很方便的来定义,它比定义一个普通class要有更好的空间性能。
4 type.NamedTuple
Python3.6中新增了type.NamedTuple类,它与collections.namedtuple的操作是类似的。不过,要定义NamedTuple就稍微不一样了。
>>> from typing import NamedTuple
# 定义Car类,继承于NamedTuple,并定义属性color、speed、autmatic
# 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
# 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
>>> class Car(NamedTuple):color:strspeed:floatautomatic:bool>>> car = Car('red',120.0,True)
>>> car
Car(color='red', speed=120.0, automatic=True)
>>> type(car)
<class '__main__.Car'>
# tuple都是不可变的
>>> car.speed = 130.0
AttributeError: can't set attribute
5.types.SimpleNamespace
使用SimpleNamespace也可以很方便的定义对象。它的定义等价于
class SimpleNamespace:def __init__(self, **kwargs):self.__dict__.update(kwargs)def __repr__(self):keys = sorted(self.__dict__)items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)return "{}({})".format(type(self).__name__, ", ".join(items))def __eq__(self, other):return self.__dict__ == other.__dict__
例如定义一个Car对象
# 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
# 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
>>> car = SimpleNamespace(color='blue',speed=150.5,automatic=True)
>>> car
namespace(automatic=True, color='blue', speed=150.5)
>>> car.color
'blue'
>>> car.speed = 120
>>> car
namespace(automatic=True, color='blue', speed=120)
# 动态添加属性
>>> car.shift = 23
>>> car
namespace(automatic=True, color='blue', shift=23, speed=120)
# 删除属性
>>> del car.shift
>>> car
namespace(automatic=True, color='blue', speed=120)
6.struct.Struct
这是一个结构体对象,可以把C语言中的struct序列化成Python对象。例如处理文件中的二进制数据或从网络中请求的数据,可以使用这个struct.Struct来表示。
使用struct好处是数据格式是预先定义好的,可以对数据进行打包成二进制数据,空间效率会好很多。
# 定义一个struct,'1sif'表示数据的格式,1s一个字符长度,i表示整数,f表示浮点数
>>> Student=Struct('1sif')
# 使用pack方法打包数据,存储性别、年龄、身高
>>> stu = Student.pack(b'm',18,175.0)
>>> stu
b'm\x00\x00\x00\x12\x00\x00\x00\x00\x00/C'
# unpack方法解包
>>> Student.unpack(stu)
(b'm', 18, 175.0)
7. class
class当然是定义一个对象的标准方式了。在Python定义类也非常简单,除了可以定义属性还可以定义方法。
>>> class Student:def __init__(self,name,age,height):self.name = nameself.age = ageself.height = heightdef printAge(self):print(self.age)>>> stu = Student('jack',18,175.0)
# 如果想让定义的对象输出属性信息可以重写__repr__方法
>>> stu
<__main__.Student object at 0x10afcd9b0>
>>> stu.name
'jack'
>>> stu.age = 19
8.总结一下
本文盘点Python中定义对象各种的方法,除了class,还有有dict、tuple、namedtuple、NamedTuple、SimpleNamespace
和Struct
。
- 如果一个对象属性不多可以使用tuple;
- 如果一个对象属性不可变可以考虑使用namedtuple或NamedTuple;
- 如果一个对象要转成JSON进行传输可以使用dict;
- 如果考虑比较空间性能,可以使用Struct。
如何在Python中表示一个对象相关推荐
- 如何在Go中找到一个对象的类型?
本文翻译自:How to find a type of an object in Go? How do I find the type of an object in Go? 如何在Go中找到对象的类 ...
- 如何在python中找到两个日期时间对象之间的时差?
本文翻译自:How do I find the time difference between two datetime objects in python? 如何分辨两个datetime对象之间的时 ...
- 如何在Python中声明一个数组?
如何在Python中声明数组? 我在文档中找不到任何对数组的引用. #1楼 这个怎么样... >>> a = range(12) >>> a [0, 1, 2, 3 ...
- 如何在Python中捕获SIGINT?
我正在研究启动多个进程和数据库连接的python脚本. 我不时地想用Ctrl + C信号杀死脚本,我想进行一些清理. 在Perl中,我可以这样做: $SIG{'INT'} = 'exit_gracef ...
- 如何在Python中解析YAML文件
如何在Python中解析YAML文件? #1楼 不依赖C标头的最简单,最纯净的方法是PyYaml( 文档 ): #!/usr/bin/env pythonimport yamlwith open(&q ...
- 如何在Python中反转列表?
如何在Python中执行以下操作? array = [0, 10, 20, 40] for (i = array.length() - 1; i >= 0; i--) 我需要一个数组的元素,但是 ...
- python set 排序_python set 排序_如何在Python中使用sorted()和sort()
点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基 著 18财税3班 李潇潇 译 日期:2019年5月6日 一. 使用sorted() ...
- python 参数个数 同名函数_如何在python中编写不同参数的同名方法
我在Java背景下学习Python(3.x). 我有一个python程序,我在其中创建一个personObject并将其添加到列表中.p = Person("John") list ...
- python if语句多个条件-关于函数:如何在python中为一个if语句提供多个条件
本问题已经有最佳答案,请猛点这里访问. 所以我在用python 3.1.5编写一些代码,这些代码需要有多个条件才能发生某些事情.例子: 1 2 3 4 5def example(arg1, arg2, ...
最新文章
- TVM apps extension示例扩展库
- python计算概率密度最大的值_Python机器学习(六十四)SciPy 统计
- q函数表格怎么看_会计表格函数玩不会?超实用会计表格函数公式大全,财务人都在用...
- 难点电路详解之负反馈放大器电路(3)
- 初五迎财神!即使没有年终奖,也要来一发红包!
- 【数据库开发】Redis key-value内存数据库介绍
- myelicesp stepover不能点_市区6处垃圾临时转运点被撤销
- php检测非法字符的一种方法
- DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.Net2.0(ver 3.0.7Beta) 增加多语言!
- 【Flink】Flink 报错 Hash join exceeded Too many duplicate keys
- 快压软件的彻底删除方法
- 基于Android的家庭财务管理流程图,基于android的个人财务管理系统的设计与实现.pdf...
- linux调试符号表,strip去除目标文件中符号表、调试符号表信息
- 内嵌PDF网页无法打开的解决办法
- php独孤九剑,(独孤九剑)--PHP 视频学习 -- 文件系统
- Mysql 密码忘了怎么办?
- zepto-selector.js简单分析
- 中国地质大学计算机研究生考试目录,2017年中国地质大学(武汉)资源学院考研专业目录及考试科目...
- poi处理word内容的公式_Java 使用 POI 操作 XWPFDocument 中的 XWPFParagraph(段落)对象的属性略解 Wor - 链滴...
- 2021高博会扩大举办,助力高尔夫运动新发展