Python “str”和“repr”的目的是什么?

Python “str”和“repr”的目的是什么?,python,Python,我真的不明白Python中在哪里使用了\uuuu str\uuuuuu和\uuuu repr\uuuuu。我的意思是,\uuu str\uu返回对象的字符串表示形式。但我为什么需要它呢?在什么用例场景中?此外,我还了解了\uuu repr\uuu 但我不明白的是,我应该在哪里使用它们 由repr()内置函数和字符串转换(反向引号)调用,以计算对象的“正式”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(给定适当的环境) 由str()内

我真的不明白Python中在哪里使用了
\uuuu str\uuuuuu
\uuuu repr\uuuuu
。我的意思是,
\uuu str\uu
返回对象的字符串表示形式。但我为什么需要它呢?在什么用例场景中?此外,我还了解了
\uuu repr\uuu

但我不明白的是,我应该在哪里使用它们

repr()
内置函数和字符串转换(反向引号)调用,以计算对象的“正式”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(给定适当的环境)

str()
内置函数和print语句调用,以计算对象的“非正式”字符串表示形式

如果您有一个类,则使用
\uuuu str\uuu
,无论何时将此对象用作字符串的一部分,您都需要一个信息性/非正式的输出。例如,您可以为Django模型定义
\u_str\u_
方法,然后在Django管理界面中呈现这些方法。而不是像
这样的东西,你会得到一个人的名字和姓氏,事件的名称和日期,等等


\uuuuu repr\uuuuuuu
\uuuuu str\uuuuuuuu
相似,事实上有时是相等的(例如来自标准库
集合.py中的
基集
类):

def\uuu repr\uu(自):
“”“返回集合的字符串表示形式。
这看起来像“Set([])”。
"""
返回自我。_repr()
#“str”与“repr”相同__
__str\uuuuuu=\uuuuuuu repr__

蚱蜢,当有疑问时。在这些文件中,您会发现_repr__;()应该:

如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象


您经常使用这两种语言的地方是在交互式会话中。如果打印对象,则会调用其
\uu str\uu
方法,而如果仅使用对象本身,则会显示其
\uu repr\uu

>>> from decimal import Decimal
>>> a = Decimal(1.25)
>>> print(a)
1.25                  <---- this is from __str__
>>> a
Decimal('1.25')       <---- this is from __repr__
>>从十进制输入十进制
>>>a=十进制(1.25)
>>>印刷品(a)
1.25>>a

Decimal('1.25')在前面的答案的基础上构建并显示更多的示例。如果使用得当,
str
repr
之间的区别是显而易见的。简而言之,
repr
应该返回一个字符串,可以通过复制粘贴来重建对象的精确状态,而
str
对于
记录
观察调试结果非常有用。下面是一些示例,以查看一些已知库的不同输出

日期时间
str
很适合打印到日志文件中,如果您想直接运行它或将其作为命令转储到文件中,可以在日志文件中重新使用as
repr

x = datetime.datetime(2017, 12, 12, 18, 49, 27, 134411)
努比 在Numpy中,
repr
也可直接使用

自定义矢量3示例 在本例中,
repr
再次返回可以直接使用/执行的字符串,而
str
作为调试输出更有用

v = Vector3([1,2,3])
print str(v)     #x: 1, y: 2, z: 3
print repr(v)    #Vector3([1,2,3])
需要记住的一点是,如果未定义
str
,但
repr
str
将自动调用
repr
。因此,至少定义
repr


str
将是非正式的可读格式,而
repr
将给出正式的对象表示

class Complex:
    # Constructor
    def __init__(self, real, imag):
        self.real = real
        self.imag = imag

    # "official" string representation of an object
    def __repr__(self):
        return 'Rational(%s, %s)' % (self.real, self.imag)

    # "informal" string representation of an object (readable)
    def __str__(self):
        return '%s + i%s' % (self.real, self.imag)

    t = Complex(10, 20)

    print (t)     # this is usual way we print the object
    print (str(t))  # this is str representation of object 
    print (repr(t))  # this is repr representation of object   

Answers : 

Rational(10, 20) # usual representation
10 + i20      # str representation
Rational(10, 20)  # repr representation

让我们有一个没有
\uuu str\uu
函数的类

class Employee:

    def __init__(self, first, last, pay):
        self.first = first 
        self.last = last
        self.pay = pay

emp1 = Employee('Ivan', 'Smith', 90000)

print(emp1)
当我们打印类的这个实例时,
emp1
,我们得到的是:

<__main__.Employee object at 0x7ff6fc0a0e48>
现在,我们不再打印存在一个对象,而是通过返回
\uuuu str\uuuu
函数获得我们指定的内容:

class Employee:

    def __init__(self, first, last, pay):
        self.first = first 
        self.last = last
        self.pay = pay

    def __str__(self):
        return(f"The employee {self.first} {self.last} earns {self.pay}.")
        # you can edit this and use any attributes of the class

emp2 = Employee('John', 'Williams', 90000)

print(emp2)

员工约翰·威廉姆斯的收入为90000英镑

strrepr都是代表收入的方式。您可以在编写类时使用它们

class Fraction:
def __init__(self, n, d):
    self.n = n
    self.d = d
def __repr__(self):
    return "{}/{}".format(self.n, self.d)
例如,当我打印它的一个实例时,它会返回一些东西

print(Fraction(1, 2))
导致

1/2
1/2
str

也导致

1/2
1/2
str
但是如果您同时编写这两个脚本,python使用哪一个呢

class Fraction:
def __init__(self, n, d):
    self.n = n
    self.d = d
def __str__(self):
    return "str"
def __repr__(self):
    return "repr"

print(Fraction(None, None))
这导致

1/2
1/2
str

因此,python实际上使用了str方法,而不是repr方法来编写这两个方法。

假设您有一个类并希望检查一个实例,您会看到打印没有提供太多有用的信息

班级人员:
定义初始(自我、姓名、年龄):
self.name=名称
self.age=年龄
p1=人(“约翰”,36岁)
印刷品(p1)#
现在看到一个带有str的类,它显示实例信息,而带有repr的类甚至不需要打印。很好不

类动物:
定义初始(自我、颜色、年龄、品种):
self.color=颜色
self.age=年龄
自我繁殖
定义(自我):
返回年龄为{self.age}的{self.color}{self.breed}
定义报告(自我):
返回f“repr:{self.color}{self.breed}年龄{self.age}”
a1=动物(“红色”,36,“狗”)
a1#报告:36岁的红狗
印刷品(a1)#36岁的红狗

对于来自Ruby的任何人,tl;dr是:
\uu str\uuuuuuuu
=
\uuuuuuu repr\uuuuuu
=
检查
。这是否回答了您的问题?谢谢这正是我要找的!“return self.\u repr()”的作用是什么,当我运行代码并试图理解它时,可以说“return self.\u repr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但是,实际问题再次表明,一开始绝对没有人试图去看主文档。问一个问题是一回事,它表明你已经试图自己回答它,但仍然对它的某些方面有点困惑,另一件事