首页 > 其他分享 >点滴 | __str__ 方法和 __repr__ 方法的区别

点滴 | __str__ 方法和 __repr__ 方法的区别

时间:2024-04-24 10:01:14浏览次数:27  
标签:__ object repr datetime str now

你可能会经常看到这样的写法:

class SomeClass(object):
    
    def __str__(self):
        return '...'
    
    __repr__ = __str__

你可能会想,__repr__ 是什么,谁会去调用它,既然和 __str__ 一样的话,为什么还需要单独定义呢。

我们来看下官方给出的定义:

  • object._repr_(self)

    repr() 内置函数调用以输出一个对象的“官方”字符串表示。如果可能,这应类似一个有效的 Python 表达式,能被用来重建具有相同取值的对象(只要有适当的环境)。如果这不可能,则应返回形式如 <...some useful description...> 的字符串。返回值必须是一个字符串对象。如果一个类定义了 __repr__() 但未定义 __str__(),则在需要该类的实例的“非正式”字符串表示时也会使用 __repr__()。此方法通常被用于调试,因此确保其表示的内容包含丰富信息且无歧义是很重要的。

  • object._str_(self)

    通过 str(object) 以及内置函数 format()print() 调用以生成一个对象的“非正式”或格式良好的字符串表示。返回值必须为一个 字符串 对象。此方法与 object.__repr__() 的不同点在于 __str__() 并不预期返回一个有效的 Python 表达式:可以使用更方便或更准确的描述信息。内置类型 object 所定义的默认实现会调用 object.__repr__()

也就是说,__repr__ 表示了对象怎么生成的,它应该尽可能返回一个可以直接用来构建对象的表达式(字符串类型),而 __str__ 则表示对象是什么,返回让人容易理解这个对象的性质的字符串。

以标准库 datetime 为例:

In [1]: import datetime

In [2]: now = datetime.datetime.now()

In [3]: str(now)
Out[3]: '2024-04-24 09:35:01.242094'

In [4]: repr(now)
Out[4]: 'datetime.datetime(2024, 4, 24, 9, 35, 1, 242094)'

In [5]: datetime.datetime(2024, 4, 24, 9, 35, 1, 242094) == now
Out[5]: True

可以看到,通过 str 调用的 now 对象,得到的是一个明显的带有年月日时分秒信息的时间字符串,而通过 repr 调用的 now 对象,会直接生成一个构造对象的表达式,通过该表达式构造出来的对象与 now 是相等的。

标签:__,object,repr,datetime,str,now
From: https://www.cnblogs.com/kingron/p/18154427

相关文章

  • 双向链表接口设计
    双向链表接口设计/***@filename:双向链表接口设计(非循环接口)*@brief*@[email protected]*@date2024/04/23*@version1.0:*@property:*@note*CopyRight(c)[email protected]*/构造双向循环链表结构体//指......
  • Cisco Catalyst 9800 Wireless Controller, IOS XE Software Release IOSXE-17.14.01
    CiscoCatalyst9800WirelessController,IOSXESoftwareReleaseIOSXE-17.14.01EDCatalyst9800系列无线控制器软件请访问原文链接:CiscoCatalyst9800WirelessController,IOSXESoftwareReleaseIOSXE-17.14.01ED,查看最新版。原创作品,转载请保留出处。作者主页:sy......
  • Cisco Catalyst 9800-CL Wireless Controller for Cloud, Release IOSXE-17.14.01 ED
    CiscoCatalyst9800-CLWirelessControllerforCloud,ReleaseIOSXE-17.14.01ED面向云的思科Catalyst9800-CL无线控制器,专为基于意图的网络全新打造请访问原文链接:CiscoCatalyst9800-CLWirelessControllerforCloud,ReleaseIOSXE-17.14.01ED,查看最新版。原创作......
  • FormData传输JSON同时上传单个/多个文件问题
    背景最近在开发一个功能时,涉及到向后端接口发送:JSON请求参数多个文件刚开始想通过RequestBody(application/json)形式进行传值,但是文件不好处理。有一个通过application/json传输文件数据的方法,就是将文件转成base64,然后在后端进行处理。但是这种方式涉及到大文件传输的时候,转......
  • Django 自定义创建密码重置确认页面
    要实现上述功能,你需要修改模板文件以添加“忘记密码”链接,并创建新的视图函数来处理密码丢失修改页面、验证和密码修改。下面是你可以进行的步骤:1.修改模板文件在登录页面的表单下方添加一个“忘记密码”链接:<divclass="form-grouptext-center"><buttontype="submit"......
  • JS之调用高德地图接口进行打卡
    调用高德地图接口进行打卡1.安装依赖"@amap/amap-jsapi-loader":"^1.0.1"2.增加代码如下:orientation.jsimportAMapLoaderfrom'@amap/amap-jsapi-loader';import{gcj02towgs84}from'./coordTransform.js';exportfunctiongetOrientati......
  • 解决ubuntu安装搜狗输入法后只能打字母
    去搜狗输入法官网按照步骤一步一步安装,结果不能正常使用。只能打字母,无法输出中文。卸载重装了几次还是不行。怀疑是最新的搜狗输入法和ubuntu20.04不匹配,升级到22.04还是不行。配置了很久搜狗输入法,不是配置的问题。从网上寻找解决办法。看到一篇帖子说是从ubuntu论坛上找到的......
  • Python基于opencv实现的人脸识别--入门项目
    先去opencv官网下载人脸识别的训练集https://opencv.org/releases/解压目录要记录主要使用haarcascade_frontalface_default.xml摄像头录入人脸(可选)可以弄一个文件夹,里面放一堆图片importcv2face_name='xxxx'#该人脸的名字#加载OpenCV人脸检测分类器face_cas......
  • 指针
    指针(c)1.基本概念1.64位操作系统中,指针占8个字节 在32位操作系统中,占4个字节2.创建指针inta=1; int*p=&a;(int是指针类型,p为指针的名称,&a是取a的地址)   *p=100;(*p此时表示取值,即*p=100 == a=100;也可以说*p==a)3.野指针;空指针int*p;//野指针int*p......
  • python包:CV
    OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语......