先抛出一个问题,之前有朋友问的:
import numpy as npif __name__ == '__main__':a = np.array([1, 2, 3], dtype=np.int32)print('a: %d' % a)
这个问题其实很简单啦,%d表示数字,而numpy.ndarray是复杂类型的对象,肯定转不了数字啦,但是可以转成字符串,所以应该用%s,即:
import numpy as npif __name__ == '__main__':a = np.array([1, 2, 3], dtype=np.int32)print('a: %s' % a)
不过对象是怎么转成字符串的呢?
如果是显示转换,调用内置函数str,比如直接a_str = str(a),那我们自己写的类需要做什么工作来支持呢,先去查一下python库文档里的str函数,看看它怎么说的。关键就是下面红框里的这一段了
也就是说我们自己写的类,要实现一个__str__()的函数。如果没有实现这个方法,那就会转而去调repr(object),那repr又需要我们实现什么方法呢?再去看它的说明:
需要我们实现的是__repr__()方法。
接下来我们直接试一下:
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f'str: name: {self.name}, age: {self.age}'def __repr__(self):return f'repr: name: {self.name}, age: {self.age}'if __name__ == '__main__':person = Person('Tom', 10)person_str = str(person)print(person)
__str__(), __repr__()都实现了,开头打印的内容不一样,我们看看会调哪个
跟库文档上说的一样,会先调__str__
接下来把__str__注释掉,再运行一下
class Person:def __init__(self, name, age):self.name = nameself.age = age# def __str__(self):#return f'str: name: {self.name}, age: {self.age}'def __repr__(self):return f'repr: name: {self.name}, age: {self.age}'if __name__ == '__main__':person = Person('Tom', 10)person_str = str(person)print(person)
就变成调__repr__啦。
不过我们上面说的这些都是显示转换,但是对象是可以直接print的啊,并不需要先显示转成字符串再print,比如直接print(person),肯定是可以的,那我们再看一下print的说明:
所以调print的时候,是会自动调str()转成字符串的,对于格式化字符串里的%s也是一样,如下
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f'str: name: {self.name}, age: {self.age}'def __repr__(self):return f'repr: name: {self.name}, age: {self.age}'if __name__ == '__main__':person = Person('Tom', 10)print(person)print('person: %s' % person)
但是如果我自己写的类都没实现这两个方法,难道它就不能被print了吗?或者说它就不能转字符串了吗?肯定可以啊,把这两个方法都删了试一下
class Person:def __init__(self, name, age):self.name = nameself.age = ageif __name__ == '__main__':person = Person('Tom', 10)print(person)
打印出来的就是类型信息、对象地址信息。
但是如果想在日志中打印一些调试信息,以便了解各个对象具体的值都是什么,难道我把要所有自己写的类都实现一下__str__方法吗?
其实也不一定要这样,比如我就想让所有的属性都打出来,方便调试,你可以直接把对象转成json就可以打印啦。
不过普通对象转json也需要自己去实现一些方法,但是如果如上面所说,我就是想让所有属性都打出来,只是为了方法调试,那可以借用object的__dict__属性来实现:
import jsonclass Car:def __init__(self, brand, price):self.brand = brandself.price = priceclass Person:def __init__(self, name, age, car):self.name = nameself.age = ageself.car = carif __name__ == '__main__':car = Car('benz', 1000000)person = Person('Tom', 10, car)json_str = json.dumps(person, default=lambda obj: obj.__dict__)print(json_str)
可以看到,不但能把Person类的属性打出来,还能把Car的属性也都打出来哦。
如果觉得《python对象怎么打印出来》对你有帮助,请点赞、收藏,并留下你的观点哦!