在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 相关文章推荐
pycharm 使用心得(三)Hello world!
Jun 05 Python
python字符串连接的N种方式总结
Sep 17 Python
Python中数字以及算数运算符的相关使用
Oct 12 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
Tensorflow简单验证码识别应用
May 25 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
Python sorted函数详解(高级篇)
Sep 18 Python
Python之使用adb shell命令启动应用的方法详解
Jan 07 Python
Python面向对象程序设计多继承和多态用法示例
Apr 08 Python
python+Django+pycharm+mysql 搭建首个web项目详解
Nov 29 Python
Python selenium的基本使用方法分析
Dec 21 Python
Django数据库迁移常见使用方法
Nov 12 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
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
PHP中preg_match函数正则匹配的字符串长度问题
2015/05/27 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
微信小程序云开发修改云数据库中的数据方法
2019/05/18 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
Python六大开源框架对比
2015/10/19 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
python实现装饰器、描述符
2018/02/28 Python
python实现年会抽奖程序
2019/01/22 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
python中round函数如何使用
2020/06/19 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
思想政治自我鉴定
2013/10/06 职场文书
大学生写自荐信的技巧
2014/01/08 职场文书
安全生产目标管理责任书
2014/07/25 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
信访维稳承诺书
2015/05/04 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书
深入理解python多线程编程
2021/04/18 Python