内置方法:
内置方法就是不需要程序员定义,本身就存在在类中的方法。内置方法又称为双下方法,魔术方法。
内置方法通常长成这样 : __名字__
所有的双下方法,都不需要我们直接调用,都有另外一种自动触发它的方法。
例如:
__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__方法。
'''