Python面向对象编程第11篇 特殊方法之__str__和__repr__
Posted 不剪发的Tony老师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python面向对象编程第11篇 特殊方法之__str__和__repr__相关的知识,希望对你有一定的参考价值。
本篇我们介绍如何利用 Python __str__ 和 __repr__ 方法定义对象的字符串表示,以及它们之间的区别。
__str__ 方法简介
以下代码定义了一个类 Person:
class Person:
def __init__(self, first_name, last_name, age):
self.first_name = first_name
self.last_name = last_name
self.age = age
Person 类包含三个属性:first_name、last_name 以及 age。
以下代码创建一个新的 Person 类实例并打印了该对象:
person = Person('John', 'Doe', 25)
print(person)
输出结果如下:
<__main__.Person object at 0x0000023405854D90>
当我们使用 print() 函数打印 Person 类的实例时,输出的是该实例的内存地址。
有时候,为实例定义一个字符串表示很有用。为此,我们需要实现特殊的 __str__ 方法。当实例调用 str() 方法时,Python 会在内部调用 __str__ 方法。
注意,print() 函数会将所有的非关键字参数转换为字符串,方法就是将参数传递给 str() 函数,然后显示返回的字符串。
以下示例为 Person 类实现了 __str__ 方法:
class Person:
def __init__(self, first_name, last_name, age):
self.first_name = first_name
self.last_name = last_name
self.age = age
def __str__(self):
return f'Person(self.first_name,self.last_name,self.age)'
当我们使用 print() 函数打印 Person 类的实例时,Python 会调用 Person 类中定义的 __str__ 方法。例如:
person = Person('John', 'Doe', 25)
print(person)
输出结果如下:
Person(John,Doe,25)
__repr__ 方法简介
__repr__ 方法定义了将类的实例作为参数传递给 repr() 方法时的行为。__repr__ 方法返回了对象的字符串表示,通常是一个可以执行的字符串。如果我们将 object_name.__repr__() 方法返回的字符串传递给 eval() 函数,将会获得和 object_name 相同的内容。
下面我们使用 repr() 方法打印 person 对象的字符串表示:
person = Person('John', 'Doe', 25)
print(repr(person))
输出结果如下:
<__main__.Person object at 0x0000023405854A30>
默认输出的结果也是对象的内存地址。如果想要自定义对象的字符串表示,可以实现以下 __repr__ 方法:
class Person:
def __init__(self, first_name, last_name, age):
self.first_name = first_name
self.last_name = last_name
self.age = age
def __repr__(self):
return f'Person("self.first_name","self.last_name",self.age)'
当我们将一个 Person 类的实例作为参数传递给 repr() 方法,Python 会自动调用 __repr__ 方法。例如:
person = Person("John", "Doe", 25)
print(repr(person))
输出结果如下:
Person("John","Doe",25)
如果我们执行返回的字符串 Person(“John”,“Doe”,25),它会返回一个 person 对象。
如果一个类没有实现 __str__ 方法,当我们将类的实例传递给 str() 方法时,Python 会返回 __repr__ 方法的结果,因为在内部 __str__ 方法调用了 __repr__ 方法。
例如:
person = Person('John', 'Doe', 25)
print(person)
输出结果如下:
Person("John","Doe",25)
如果一个类实现了 __str__ 方法,当我们将类的实例传递给 str() 方法时,Python 会调用 __str__ 方法。例如:
class Person:
def __init__(self, first_name, last_name, age):
self.first_name = first_name
self.last_name = last_name
self.age = age
def __repr__(self):
return f'Person("self.first_name","self.last_name",self.age)'
def __str__(self):
return f'(self.first_name,self.last_name,self.age)'
person = Person('John', 'Doe', 25)
# use str()
print(person)
# use repr()
print(repr(person))
食醋结果如下:
(John,Doe,25)
Person("John","Doe",25)
两种方法比较
__str__ 和 __repr__ 方法的主要区别是它们的目标用户不同。
__str__方法返回的字符串是为了给终端用户使用,而 __repr__ 方法返回的字符串是为了给机器使用。
总结
- __str__ 和 __repr__ 方法都可以实现对象的字符串形式,__str__ 方法默认调用了 __repr__ 方法。
以上是关于Python面向对象编程第11篇 特殊方法之__str__和__repr__的主要内容,如果未能解决你的问题,请参考以下文章
Python面向对象编程第14篇 特殊方法之__bool__