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

 

  

 

  

 

posted @ 2018-09-11 15:57  hehehe1994  阅读(174)  评论(0编辑  收藏  举报