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

在 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

<__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中表示一个对象的方法

本文地址: http://www.cppcns.com/jiaoben/python/263402.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI造假 vs AI打假 终结“猫鼠游戏”不能只靠技术

来源&#xff1a;和讯网人脸识别作为生物识别中的重要手段&#xff0c;成为了近年身份识别中最热门的领域。但与人脸识别技术共同发展的&#xff0c;还有借助机器学习系统、图像视频和音频内容&#xff0c;更改人脸、物体或环境呈现方式的深度伪造技术。随着这一技术的日趋成熟…

单例设计模式之安全的懒汉式

package 单例模式; /*** 单例设计模式之安全的懒汉式*/ class Single{private static Single single null;//私有构造方法private Single() {}//对外提供公有的获取内部创建的Single对象public static Single getInstance(){if(singlenull){synchronized(Single.class){if(sing…

navicat导入excel_傻瓜式教学【数据库管理工具Navicat】

想玩数据怎么能连sql都不会&#xff0c;想写sql怎么能不会用最简单的NavicatNavicat的安装看这里手把手教你安装Navicat——靠谱的Navicat安装教程​www.jianshu.com猴子&#xff1a;客户端navicat安装教程​zhuanlan.zhihu.com装好了Navicat&#xff0c;首先将csv格式的excel文…

你好AI丨重读图灵经典之作,九条反驳意见引人深思

来源&#xff1a; AI科技评论编译 | 丛末、蒋宝尚当一台计算机能够骗过人类&#xff0c;让他们相信它就是一个人的时候&#xff0c;就能够被称作智能。编者按&#xff1a;对于艾伦图灵&#xff0c;相信大家都并不陌生&#xff0c;作为人工智能鼻祖&#xff0c;图灵的诸多观点即…

java 比较源文件_Beyond Compare比较Java源代码文件的操作方法

今天小编就带大家来共同学习BeyondCompare如何比较Java源代码文件希呢?望可以帮助到有需要的小伙伴哦&#xff0c;下面就是详细完整的操作步骤。打开BeyondCompare&#xff0c;在主页面左侧目录下选择文本比较会话&#xff0c;打开会话操作界面。分别单击比较会话界面“打开文…

关于研究的方法

转载于:https://www.cnblogs.com/freedommovie/p/6769717.html

【学术快报】韩世辉课题组在《eLife》发表论文揭示群体冲突中复仇的神经生物学机制...

来源&#xff1a;脑科学在群体冲突中&#xff0c;看到对手伤害自己的队友会激发报复行为&#xff0c;去攻击对手。这一复杂社会行为贯穿人类历史&#xff0c;阐明其机理具有重要科学意义和社会价值。心理学研究提出对“内群体的爱”&#xff08;ingroup love&#xff09;或/和对…

无聊的python课程_python教案课程

第五单元进阶程序设计(总10课时)第一节选择编程语言(1课时)一、教学目标1、了解程序设计语言和两种翻译方式&#xff1b;2、了解Python背景、功能、安装&#xff0c;熟悉Python编程环境&#xff1b;3、编程初体验。体验一个小程序从建立、输入、调试、运行、保存的全过程。掌握…

《面向对象程序设计》课程作业二

github链接作业链接编写一个程序&#xff0c;要求根据给定的圆的半径求圆的面积&#xff0c;并将求得的结果打印出来。……建立一个工程&#xff0c;将程序写成两个.cpp和一个.h的形式。 这个问题倒是没什么难的&#xff0c;但对于同学们来说是一个上手模块化的好开端。从现在开…

报告 | 超级智能城市2.0 – 人工智能引领新风尚(附下载)

来源&#xff1a;智慧城市决策参考未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联…

icmp协议_ICMP协议【41】

1、回顾TCP/IP协议栈为了更有效地转发IP数据报和提高交付成功的机会......2、ICMP协议的简介(1)ICMP&#xff0c;全称为Internet Control Message Protocol&#xff0c;即网际控制报文协议、网际控制消息协议。(2)它是TCP/IP协议族的一个子协议&#xff0c;用于在IP主机、路由器…

java的字节码无法显示_【java】查看Java字节码文件内容的方法+使用javap找不到类 解决方法...

研究synchronized底层实现&#xff0c;涉及到查看java字节码的需要前提是&#xff0c;你的PC已经成功安装了JDK并别配置了环境变量。查看方法一.javap查看简约字节码方式1.准备一个java文件例如&#xff0c;文件所在目录在此处Student.java文件内容如下&#xff1a;packagecom.…

SparkR

SparkR 支持原创&#xff1a;http://blog.csdn.net/dr_guo/article/details/51377784 突然有个想法&#xff0c;R只能处理百万级别的数据&#xff0c;如果R能运行在Spark上多好&#xff01;搜了下发现13年SparkR这个项目就启动了&#xff0c;感谢美帝&#xff01; 1.你肯定得先…

彻底颠覆神经科学?神经信号可能不是电信号,而是机械波?!

来源&#xff1a;环球科学就职于哥本哈根尼尔斯玻尔研究所的托马斯亨伯格&#xff08;Thomas Heimburg&#xff09;&#xff0c;是一位研究量子力学和生物物理的物理学家。然而&#xff0c;他却希望推翻很多神经科学教科书上的内容。在亨伯格看来&#xff0c;神经元之间通过类似…

java可视化压缩_25个小众的Java库

25年前&#xff0c;James Gosling创建了Java&#xff0c;并永远地改变了编程语言的版图。与许多其他编程语言不同&#xff0c;Java在整个生命周期中都受到业界的高度欢迎和需求。Java具有非常优秀的Core库&#xff0c;提供了许多基本功能。 基于其高度流行性&#xff0c;因此也…

java 线程变量put_Java线程(篇外篇):线程本地变量ThreadLocal

首先说明ThreadLocal存放的值是线程内共享的&#xff0c;线程间互斥的&#xff0c;主要用于线程内共享一些数据&#xff0c;避免通过参数来传递&#xff0c;这样处理后&#xff0c;能够优雅的解决一些实际问题&#xff0c;比如hibernate中的OpenSessionInView&#xff0c;就是使…

深度解读:人体防御病毒的免疫力究竟是什么?

来源&#xff1a;国际仿生工程学会“免疫力作为机体免除瘟疫的一种能力&#xff0c;已被广大民众广泛使用&#xff0c;特别是本次新型冠状病毒的暴发&#xff0c;更是使得免疫力在新闻媒体中广泛传播。对于这样一个极其抽象模糊的术语&#xff0c;我们需要理解其真实的含义是什…

洛谷 1087——FBI树

题目描述 我们可以把由“0”和“1”组成的字符串分为三类&#xff1a;全“0”串称为B串&#xff0c;全“1”串称为I串&#xff0c;既含“0”又含“1”的串则称为F串。 FBI树是一种二叉树&#xff0c;它的结点类型也包括F结点&#xff0c;B结点和I结点三种。由一个长度为2^N的“…

python开发web使用什么工具_常用的Python web开发工具盘点

www.oldboyedu.com老男孩IT教育&#xff0c;只培养技术精英常用的Python web开发工具盘点Python是一门动态、面向对象语言。其最初就是作为一门面向对象语言设计的&#xff0c;并且在后期又加入了一些更高级的特性。除了语言本身的设计目的之外&#xff0c;Python标准库也是值得…

java的add方法的使用_Java HashSet add()方法与示例

HashSet类add()方法add()方法在java.util包中可用。当尚不存在给定元素时&#xff0c;使用add()方法将其插入此HashSet中&#xff0c;否则它将忽略它并返回false。add()方法是一种非静态方法&#xff0c;只能通过类对象访问&#xff0c;如果尝试使用类名称访问该方法&#xff0…