在Python中表示一个对象的方法


Posted in Python onJune 25, 2019

在 Python 中一切都是对象。如果要在 Python 中表示一个对象,除了定义 class 外还有哪些方式呢?我们今天就来盘点一下。

0x00 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}

0x01 tuple

tuple 也可以表示一个对象,相对于 dict 来说, 它是不可变的,一旦创建就不能随意修改。 tuple 也只能通过下标来访问对象的属性,因此当属性比较多时使用起来没有 dict 方便。

# 对象属性为name、age、height
>>> 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

0x02 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 要有更好的空间性能。

0x03 type.NamedTuple

Python3.6 中新增了 type.NamedTuple 类,它与 collections.namedtuple 的操作是类似的。不过,要定义 NamedTuple 就稍微不一样了。

>>> from typing import NamedTuple
# 定义Car类,继承于NamedTuple,并定义属性color、speed、autmatic
>>> class Car(NamedTuple):
 color:str
 speed:float
 automatic: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

0x04 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 对象

>>> 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)

0x05 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)

0x06 class

class 当然是定义一个对象的标准方式了。在 Python 定义类也非常简单,除了可以定义属性还可以定义方法。

>>> class Student:
 def __init__(self,name,age,height):
 self.name = name
 self.age = age
 self.height = height
 def printAge(self):
  print(self.age)
>>> stu = Student('jack',18,175.0)
# 如果想让定义的对象输出属性信息可以重写__repr__方法
>>> stu
<__main__.Student object at 0x10afcd9b0>
>>> stu.name
'jack'
>>> stu.age = 19

0x07 总结一下

本文盘点 Python 中定义对象各种的方法,除了 class ,还有有 dict 、 tuple 、 namedtuple 、 NamedTuple 、 SimpleNamespace 和 Struct 。

如果一个对象属性不多可以使用 tuple ;

如果一个对象属性不可变可以考虑使用 namedtuple 或 NamedTuple ;

如果一个对象要转成 JSON 进行传输可以使用 dict ;

如果考虑比较空间性能,可以使用 Struct 。

总结

以上所述是小编给大家介绍的在Python中表示一个对象的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
简介Python中用于处理字符串的center()方法
May 18 Python
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
Python生成随机数组的方法小结
Apr 15 Python
Python实现曲线点抽稀算法的示例
Oct 12 Python
python socket网络编程之粘包问题详解
Apr 28 Python
python并发编程多进程 互斥锁原理解析
Aug 20 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
Sep 07 Python
python利用dlib获取人脸的68个landmark
Nov 27 Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
Feb 26 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 Python
python使用re模块爬取豆瓣Top250电影
Oct 20 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
Jun 25 #Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
Jun 25 #Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 #Python
PyQt5组件读取参数的实例
Jun 25 #Python
华为2019校招笔试题之处理字符串(python版)
Jun 25 #Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
Jun 24 #Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
Jun 24 #Python
You might like
PHP版自动生成文章摘要
2008/07/23 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
2011/03/09 PHP
php列出一个目录下的所有文件的代码
2012/10/09 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
Laravel下生成验证码的类
2017/11/15 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
2013/11/19 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
JavaScript中判断函数、变量是否存在
2015/06/10 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
JavaScript在web自动化测试中的作用示例详解
2019/08/25 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
python文件和目录操作方法大全(含实例)
2014/03/12 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
Python:slice与indices的用法
2019/11/25 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
在python中使用nohup命令说明
2020/04/16 Python
移动端rem布局的两种实现方法
2018/01/03 HTML / CSS
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
运动会广播稿150字
2014/02/19 职场文书
普通大学毕业生自荐信范文
2014/02/23 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
会议通知
2015/04/15 职场文书
法制教育主题班会
2015/08/13 职场文书