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

对于一个简单的对象,我们使用 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)

# 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

>>> stu.name

'jack'

>>> stu.age = 19

0x07 总结一下

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

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

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

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

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

总结

以上所述是小编给大家介绍的在Python中表示一个对象的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

python中立方表示_在Python中表示一个对象的方法相关推荐

  1. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  2. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  3. python 邮箱验证_在Django中进行用户注册和邮箱验证的方法

    本文主要介绍我在利用Django写文章时,采用的注册方法.首先说一下整体逻辑思路: •处理用户注册数据, •产生token,生成验证URL, •发送验证邮件, •用户登录网址,进行验证, •验证处理. ...

  4. python selenium 下拉列表_从下拉列表中选择python selenium选项

    我试图使用下面的代码使用selenium(python)从网页上的下拉列表中选择一个选项.在from selenium import webdriver from selenium.webdriver ...

  5. python的认识_理解 Python 中的 *args 和 **kwargs

    Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def test_defargs(one, two = 2): print 'Required argument: ', one ...

  6. python 语料标注_在python中怎么标记文本?

    要运行下面的python程序,必须在系统中安装(NLTK)自然语言工具包. NLTK模块是一个庞大的工具包,旨在帮助您使用整个自然语言处理(NLP)方法. 要安装NLTK,请在终端中运行以下命令.su ...

  7. python getattr函数_[转]Python中的getattr()函数详解

    看了下函数本身的doc getattr(object, name[, default]) -> value Get a named attribute from an object; getat ...

  8. python反向缩进_在Pycharm中对代码进行注释和缩进的方法详解

    在Pycharm中对代码进行注释和缩进的方法详解 一.注释 1. #单行注释 2. """ 多行注释 """ 3. pycharm多行注释快 ...

  9. python pipeline框架_介绍Python的Django框架中的静态资源管理器django-pipeline

    django-pipeline 是一个 Django 下非常方便的静态资源管理 app,尤其是 1.2 版本之后,利用 django-staticfiles 的collectstatic 命令,在开发 ...

最新文章

  1. 面试官:你写的单例模式有空指针异常,请你用Volatile改一下。我愣了五分钟...
  2. FIFO的读写操作时序图
  3. SQL数据库隐藏服务器后需要在连接字符串增加端口号,(provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)]...
  4. 分计算iv值_S71200PLC模拟量编程方法与计算原理
  5. Matlab的不同进制转换
  6. djangoORM语句
  7. sql unicode转中文_SELECT语句《SQL必知必会》
  8. readfile函数使用方法_1分钟学会LOOKUP函数,有网友说使用这个方法,初学者秒变大神...
  9. Python安装dlib包
  10. datagridview设置某一行选中_机关公文格式设置规范(最新版)
  11. 使用ASP.Net WebAPI构建REST服务(四)——参数绑定
  12. hdfs集成ldap
  13. 企业的生存必须找到你的核心竞争力
  14. mysql 基础面试_面试必问之mysql基础
  15. 学生信息管理系统(c++源代码实现)
  16. windows系统下更改itunes默认备份地址(小白实操)
  17. jupyter报错EnvironmentLocationNotFound: Not a conda environment: /root/anaconda3/envs/anaconda3
  18. easyexcel表头和内容居中
  19. 无人驾驶公司大全(原无人驾驶龙虎榜)
  20. SE14激活并调整数据库时报数据库对象不一致错误

热门文章

  1. WeChat微信支付类型与支付授权目录配置与回调地址设置
  2. python 装饰器分类_Python 装饰器(Decorators) 超详细分类实例
  3. python数据标准化1002无标题,Scikit标准化互信息学习给我错误的值
  4. 关于微信授权与登录的相关操作(纯手敲)
  5. oracle 使从表中随机取出一行记录数据
  6. float相乘后的类型_Psychopy | 第1期:数据类型及运算符
  7. mysql数据存储方式_数据存储在mysql的两种方式
  8. tomcat c3p0 mysql_C3P0数据库连接池与tomcat一起使用时报错
  9. 【excel】vlookup
  10. 【若依(ruoyi)】表格实现tooltip