内置方法 str-repr

一、平时我们获取打印一个对象的时候,我们打印的是它的地址,如果我们想知道其中具体的值必须一个一个对象.属性调取,

  如何去用某种东西去一次性打印出我们所需要的呢?如下,我们有两种方法

 

    优先级:__str__   > __repr__

    __str__方法在一个类的内部的定义,跟在外部的调用,如下

    

class A(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    
    def __str__(self)                              #如果不实现str方法打印出来的是对象的地址
        return f'{self.name}{self.age}'   
person = A('alex',123)
#调用方式(触发str): #1. print(person) #打印触发 #2. print(f'{python}') #格式化触发
class A(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    # def __repr__(self):
        # return f'{self.name},{self.age}'
    def __str__(self):
        return f'{self.name},{self.age}'

alex = A('alex',23)
print(alex)
print(f'{alex}')
print(repr(alex))
print('%r'%alex)


# 如果str存在,repr也存在
# 那么print(obj)和使用字符串格式化format,%s这两种方式 调用的都是__str__
# 而repr(obj)和%r格式化字符串,都会调用__repr__
# 如果str不存在,repr存在
# 那么print(obj),字符串格式化format,%s,%r 和repr(obj)都调用__repr__
# 如果str存在,repr不存在
# 那么print(obj)和使用字符串格式化format,%s这两种方式 调用的都是__str__
# repr(obj)和%r格式化字符串 都会打印出内存地址

综上所述,我们还是用repr好,你说呢?

class A(object):
    def __init__(self,name,price,period):
        self.name = name
        self.price = price
        self.period = period
    def __repr__(self):
        return f'{self.name},{self.price},{self.period}'
    def __str__(self):
        return f'---{self.name},{self.price},{self.period}'

class B(A):
    def __repr__(self):
        return f'{self.name}---{self.price}---{self.period}'
    def __str__(self):
        return f'{self.name}?{self.price}?{self.period}'
    # pass
py20 = B('alex',100,2)
print(py20)

注意:打印的时候先找自己的str,如果没有找父类的str,如果父类也没有就找自己的repr,如果自己也没repr,就找父类的repr

# 有了repr或者str在打印对象的时候 就不会显示用户不关心的内存地址了
# 增强了用户的体验 在程序开发的过程中
# 如果我们需要频繁打印对象中的属性,需要从类的外部做复杂的拼接,实际上是一种麻烦
# 如果这个拼接工作在类的内部已经完成了,打印对象的时候直接就能显示

posted @ 2019-04-02 14:30  帅气的小神气  阅读(164)  评论(0编辑  收藏  举报