python对象怎么打印出来

先抛出一个问题,之前有朋友问的:

import numpy as np

if __name__ == '__main__':
    a = np.array([1, 2, 3], dtype=np.int32)
    print('a: %d' % a)

 这个问题其实很简单啦,%d表示数字,而numpy.ndarray是复杂类型的对象,肯定转不了数字啦,但是可以转成字符串,所以应该用%s,即:

import numpy as np

if __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 = name
        self.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)

__str__(), __repr__()都实现了,开头打印的内容不一样,我们看看会调哪个

跟库文档上说的一样,会先调__str__

 接下来把__str__注释掉,再运行一下

class Person:
    def __init__(self, name, age):
        self.name = name
        self.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 = name
        self.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)
    print(person)
    print('person: %s' % person)

 

 但是如果我自己写的类都没实现这两个方法,难道它就不能被print了吗?或者说它就不能转字符串了吗?肯定可以啊,把这两个方法都删了试一下

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age


if __name__ == '__main__':
    person = Person('Tom', 10)
    print(person)

 打印出来的就是类型信息、对象地址信息。

但是如果想在日志中打印一些调试信息,以便了解各个对象具体的值都是什么,难道我把要所有自己写的类都实现一下__str__方法吗?

其实也不一定要这样,比如我就想让所有的属性都打出来,方便调试,你可以直接把对象转成json就可以打印啦。

不过普通对象转json也需要自己去实现一些方法,但是如果如上面所说,我就是想让所有属性都打出来,只是为了方法调试,那可以借用object的__dict__属性来实现:

import json


class Car:
    def __init__(self, brand, price):
        self.brand = brand
        self.price = price


class Person:
    def __init__(self, name, age, car):
        self.name = name
        self.age = age
        self.car = car


if __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的属性也都打出来哦。 

猜你喜欢

转载自blog.csdn.net/ogebgvictor/article/details/128275417