Python中__str__和__repr_之间有什么区别?
当前回答
每个对象都从所有对象创建的基类继承__repr_。
class Person:
pass
p=Person()
如果你调用repr(p),你会得到默认值:
<__main__.Person object at 0x7fb2604f03a0>
但如果调用str(p),则会得到相同的输出。这是因为当__str__不存在时,Python调用__repr__
让我们实现自己的__str__
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def __repr__(self):
print("__repr__ called")
return f"Person(name='{self.name}',age={self.age})"
p=Person("ali",20)
print(p)和str(p)将返回
__repr__ called
Person(name='ali',age=20)
让我们添加__str__()
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
print('__repr__ called')
return f"Person(name='{self.name}, age=self.age')"
def __str__(self):
print('__str__ called')
return self.name
p=Person("ali",20)
如果我们调用print(p)和str(p),它将调用__str__(),因此它将返回
__str__ called
ali
repr(p)将返回
repr调用“人(name=‘ali,age=self.age’)”
让我们省略__repr_,只实现__str__。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
print('__str__ called')
return self.name
p=Person('ali',20)
print(p)将查找__str__并返回:
__str__ called
ali
注意:如果我们定义了__repr_和__str__,则f'name为{p}'将调用__str__
其他回答
__str__必须返回字符串对象,而__repr_可以返回任何python表达式。如果缺少__str__实现,则__repr_函数用作回退。如果缺少__repr_函数实现,则没有回退。如果__repr_函数返回对象的String表示,我们可以跳过__str__函数的实现。
资料来源:https://www.journaldev.com/22460/python-str-repr-functions
来自effbot的(非官方)Python参考Wiki(存档副本):
__str__“计算对象的“非正式”字符串表示。这与__repr_不同,因为它不必是有效的Python表达式:可以使用更方便或更简洁的表示。”
str-从给定对象创建一个新的字符串对象。
repr-返回对象的规范字符串表示形式。
差异:
str():
使对象可读为最终用户生成输出
repr():
需要复制对象的代码为开发人员生成输出
每个对象都从所有对象创建的基类继承__repr_。
class Person:
pass
p=Person()
如果你调用repr(p),你会得到默认值:
<__main__.Person object at 0x7fb2604f03a0>
但如果调用str(p),则会得到相同的输出。这是因为当__str__不存在时,Python调用__repr__
让我们实现自己的__str__
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def __repr__(self):
print("__repr__ called")
return f"Person(name='{self.name}',age={self.age})"
p=Person("ali",20)
print(p)和str(p)将返回
__repr__ called
Person(name='ali',age=20)
让我们添加__str__()
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
print('__repr__ called')
return f"Person(name='{self.name}, age=self.age')"
def __str__(self):
print('__str__ called')
return self.name
p=Person("ali",20)
如果我们调用print(p)和str(p),它将调用__str__(),因此它将返回
__str__ called
ali
repr(p)将返回
repr调用“人(name=‘ali,age=self.age’)”
让我们省略__repr_,只实现__str__。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
print('__str__ called')
return self.name
p=Person('ali',20)
print(p)将查找__str__并返回:
__str__ called
ali
注意:如果我们定义了__repr_和__str__,则f'name为{p}'将调用__str__
简单地说:
__str__用于显示对象的字符串表示形式,以便其他人轻松读取。
__repr_用于显示对象的字符串表示。
假设我想创建一个分数类,其中分数的字符串表示为“(1/2)”,对象(分数类)表示为“分数(1,2)”
因此,我们可以创建一个简单的Fraction类:
class Fraction:
def __init__(self, num, den):
self.__num = num
self.__den = den
def __str__(self):
return '(' + str(self.__num) + '/' + str(self.__den) + ')'
def __repr__(self):
return 'Fraction (' + str(self.__num) + ',' + str(self.__den) + ')'
f = Fraction(1,2)
print('I want to represent the Fraction STRING as ' + str(f)) # (1/2)
print('I want to represent the Fraction OBJECT as ', repr(f)) # Fraction (1,2)
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录