zoukankan      html  css  js  c++  java
  • 内置方法 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在打印对象的时候 就不会显示用户不关心的内存地址了
    # 增强了用户的体验 在程序开发的过程中
    # 如果我们需要频繁打印对象中的属性,需要从类的外部做复杂的拼接,实际上是一种麻烦
    # 如果这个拼接工作在类的内部已经完成了,打印对象的时候直接就能显示

  • 相关阅读:
    新概念4-27
    胡雪岩06
    新概念4-26
    新概念4-25
    作业01
    day 01 小结
    计算机编程基础
    计算机组成
    markdown文档的编写
    zoj 2674 Strange Limit 欧拉定理应用 (3-E)
  • 原文地址:https://www.cnblogs.com/CNHK1949/p/10642458.html
Copyright © 2011-2022 走看看