zoukankan      html  css  js  c++  java
  • 内置方法:__str__和__repr__

    内置方法:

      内置方法就是不需要程序员定义,本身就存在在类中的方法。内置方法又称为双下方法,魔术方法。

      内置方法通常长成这样 : __名字__

      所有的双下方法,都不需要我们直接调用,都有另外一种自动触发它的方法。

      例如:

        __init__()初始化方法,不需要主动调用,而是实例化的时候内部自己调用。


     __str__

      如果想把一个类的实例变成str类型,打印对象名的时候就执行__str__方法。

       三种场景会触发__str__方法:

      (1)当你打印一个对象名的时候,就会就会触发__str__。  

      (2)当你使用%s格式化输出对象的时候,也会触发__str__。

      (3)强制转换数据类型的时候,也会触发__str__。

    class Course:
        def __init__(self,name,period,price,teacher):
            self.name = name
            self.period = period
            self.price = price
            self.teacher = teacher
    
        def __str__(self):
            return '%s %s %s %s'%(self.name,self.period,self.price,self.teacher)
    course_lst = []
    python = Course('python','六个月',29800,'alex')
    print(python)                       #1.打印对象名,自动触发__str__方法
    >>>
    python 六个月 29800 alex
    
    course_lst.append(python)
    linux = Course('linux','五个月',20000,'oldboy')
    course_lst.append(linux)
    for index,course in enumerate(course_lst):
        print('%s %S'%(id,course))      #2.当使用%s格式化的时候,自动触发__str__
    

    __repr__

      (1)__repr__是__str__方法的备胎,如果有__str__就使用__str__,否则执行__repr__。

    # (1)同时存在_str__和__repr__两个方法:
    class Course:
        def __init__(self,name,period,price,teacher):
            self.name = name
            self.period = period
            self.price = price
            self.teacher = teacher
    
        def __str__(self):
            return 'str:%s %s %s %s'%(self.name,self.period,self.price,self.teacher)
    
        def __repr__(self):
            return 'repr:%s %s %s %s'%(self.name,self.period,self.price,self.teacher)
    
    python = Course('python','六个月',29800,'alex')
    print(python)                       #1.符合打印对象名,自动触发执行__str__方法。
    >>>
    str:python 六个月 29800 alex
    
    # (2)只存在__repr__方法时,再次打印对象名
    class Course:
        def __init__(self,name,period,price,teacher):
            self.name = name
            self.period = period
            self.price = price
            self.teacher = teacher
       #注释掉__str__双下方法
        # def __str__(self):
        #     return 'str:%s %s %s %s'%(self.name,self.period,self.price,self.teacher)
    
        def __repr__(self):
            return 'repr:%s %s %s %s'%(self.name,self.period,self.price,self.teacher)
    python = Course('python','六个月',29800,'alex')
    print(python)                       #2.当__str__没有时,执行__repr__方法
    >>>
    repr:python 六个月 29800 alex

      如果__repr__仅仅只是__str__的备胎,那么它就没有存在的意义了。所有__repr__还是有它自己的用武之地的时候:

      (2)如果使用内置函数repr(obj),或者通过%r格式化的时候,就会自动触发__repr__方法,不管有没有__str__,都调用__repr__。

    python = Course('python','六个月',29800,'alex')
    print(repr(python))            #通过repr(obj)的方式打印对象名,调用的是__repr__方法。
    >>>
    repr:python 六个月 29800 alex
    

    小技巧:

      python中之所有既有__str__,又有__repr__,__str__用于显示给用户看,__repr__用于显示给开发人员看。 下面就有一个偷懒的小办法:

    __str__=__repr__
    

    拓展知识:

    class Foo:
        def __str__(self):
            return 'Foo.str'
        def __repr__(self):
            return 'Foo.repr'
    
    class Son(Foo):
        def __str__(self):
            return 'Son.str'
        def __repr__(self):
            return 'Son.repr'
    
    s1 = Son()
    print(s1)
    >>>
    Son.str
    '''
    (1) 先去子类中查找,先调用__str__方法。
    (2) 如果把子类的__str__方法注释掉,会去父类中查找父类的__str__方法
    (3) 如果把父类的__Str__的方法注释掉,会再回到子类中执行备胎__repr__方法。
    '''
    

      

      

  • 相关阅读:
    自定义异常
    finally关键字
    捕捉异常try-catch
    throws抛出异常
    exception概述和分类
    jvm前奏篇
    Java并发编程学习随笔 (一) 使用run() 和 start()的差别
    MyCat学习 ------分库分表 随笔
    java最常用的内置工具类
    Mybatis框架常见面试题
  • 原文地址:https://www.cnblogs.com/hebbhao/p/9628258.html
Copyright © 2011-2022 走看看