str(), repr()方法的使用
我们在定义了一个类后, 如果直接实例化并打印,会得不到自己想要的结果 ,默认的“转换字符串”功能非常的原始:
class Car():
def __init__(self,color,mileage):
self.color = color
self.meileage = mileage
my_car = Car('red', '33')
print(my_car)
打印:
<__main__.Car object at 0x01449810>
可以看到得到的结果是一串内存地址,虽然有了结果, 但显然不是我们想要的, 当然, 你可以这样来获取属性:
print(my_car.color)
print(my_car.meileage)
这样思路正确, 但是忽略了python将对象转成字符串的约定和内存机制, 一个好的方法是想类中添加字符串方法 str 和 repr, 看一下实例:
class Car():
def __init__(self,color,mileage):
self.color = color
self.meileage = mileage
# 尝试将对象转化为字符串的方法
def __str__(self):
return f'a {self.color} car'
my_car = Car('red', '33')
print(my_car)
结果:
a red car
str方法是python中内置的字符串转换方法, 是一种以双下滑线规定的方法, 当然, 你也可以使用更人性化的方法,
print(str(my_car))
#或者:
print(my_car.__str__())
除了这种内置转换方法之外, 还要一种也就是 repr(), 使用它依然可以得到字符串转换后的结果:
class Car():
def __init__(self,color,mileage):
self.color = color
self.meileage = mileage
def __repr__(self):
return f' {self.meileage} mileage'
my_car = Car('red', '33')
# 结果
# 33 mileage for Car
str() 与repr()的区别
可以看出, 这两个方法都是字符串转换的方法, 但是这两个方法有什么不同呢?
import datetime
t = datetime.datetime.today()
首先导入datetime模块, 打印分别使用两个内置方法打印今天的日期:
print(str(t))
print(t.__repr__())
打印:
2019-08-19 09:39:17.885315
datetime.datetime(2019, 8, 19, 9, 39, 17, 885315)
比较二者的结果可以得出结果, str()方法侧重的是可读性, 也就是说更加人性化的结果或者答案, 能够熟悉的理解的答案,而__repr__()方法则更侧重于得到无歧义的结果, 更倾向于开发人员来调试程序。
为什么添加__repr()__方法
上面说了两个类的区别, 可能就有小伙伴说了, 既然repr()方法更倾向于调试程序, 为什么还要在定义的类中添加呢, 因为如果在定义的类中如果不提供__str()__方法,程序会默认寻找__repr()方法, 所以我们最好总是在定义一个str()后,在定义一个repr()方法。