python中__str__和__repr__魔法方法详解
class Cat: """定义一个猫类""" def __init__(self, new_name, new_age): """在创建完对象之后 会自动调用, 它完成对象的初始化的功能""" # self.name = "汤姆" # self.age = 20 self.name = new_name self.age = new_age # 它是一个对象中的属性,在对象中存储,即只要这个对象还存在,那么这个变量就可以使用 # num = 100 # 它是一个局部变量,当这个函数执行完之后,这个变量的空间就没有了,因此其他方法不能使用这个变量 def __str__(self): """返回一个对象的描述信息""" # print(num) num是__init__函数的局部变量,作用域只在__init__函数内 return "名字是:%s , 年龄是:%d" % (self.name, self.age) # __repr__=__str__ def eat(self): print("%s在吃鱼...." % self.name) def drink(self): print("%s在喝可乐..." % self.name) def introduce(self): # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄)) #self对应的就是对象 print("名字是:%s, 年龄是:%d" % (self.name, self.age)) # 创建了一个对象 tom = Cat("汤姆", 30) print(tom)
总结:
- 在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法
- 当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据
- __str__方法需要返回一个字符串,当做这个对象的描写
- 事实上,__str__是被print函数调用的,一般都是return一个字符串,
python里面的对象基本上都默认有个__str__供print函数所用
- 当输出一个类的实例tom时,如果__str__和__repr__这两个方法都没有重写,会输出tom的地址;如果重写了str,用print(tom)可以输出__str__的返回值,如果重写了__repr__,直接写tom就可以输出__repr__的返回值。
为了方便,可以在重写完__str__后来一句__repr__ = __str__ 这样两个魔法方法完全一致(函数入口一样)
》》两个函数同时存在,优先执行__str__函数
- 可以理解为:__str__是给用户使用的,而__repr__是提供给程序员用于调试程序用的。
一般来说,str 的返回结果在于强可读性,而 repr 的返回结果在于准确性。
__str__和__repr__这两个方法都是用于显示的。(representation,表达,表示)
- 我们可以使用 str 和 repr 方法定义类到字符串的转化方式,而不需要手动打印某些属性或是添加额外的方法。
我们至少需要添加一个 repr 方法来保证类到字符串的自定义转化的有效性,str 是可选的。因为默认情况下,在需要却找不到 str 方法的时候,会自动调用 repr 方法。
追加:其实后面用到juptyer book 时候就对这个深有体会了,比如一个数据在解释器中只有通过print才能打印出里面的值,这很麻烦。而在jupyter book中直接执行这个数据,就可以获得里面的数据,方便调
试程序,即使获得反馈