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__方法。
    '''
    

      

      

  • 相关阅读:
    【原创】使用开源libimobiledevice盗取iphone信息
    【原创】Arduino制作Badusb实践
    【原创】Aduino小车玩法全记录
    【原创】Arduino入门基础知识总结
    【原创】Arduino、arm、树莓派与单片机
    【原创】PM3破解IC卡记录
    【转】反编译D-Link路由器固件程序并发现后门
    DDOS分布式拒绝服务
    XSS 初识
    针对企业级别渗透测试流程
  • 原文地址:https://www.cnblogs.com/hebbhao/p/9628258.html
Copyright © 2011-2022 走看看