会在对象被转换为字符串时或print()时候,转换的结果就是这个函数的返回值
使用场景:咱们能够利用该函数来自定义,对象的是返回值(通常人为为打印格式)
列子一python
class Foo: def __init__(self, name, age): """对象实例化的时候自动触发""" self.name = name self.age = age def __str__(self): print('打印的时候自动触发,可是其实不须要print便可打印') return f'{self.name}:{self.age}' # 若是不返回字符串类型,则会报错 obj = Foo('nash', 18) print(obj) # obj.__str__() # 打印的时候就是在打印返回值
列子二程序员
import time class Person: def __init__(self,name,age): self.name = name self.age = age def __str__(self): return "这是一个person对象 name:%s age:%s" % (self.name,self.age) pass def __del__(self): print("del run") p = Person("jack",20) # del p time.sleep(2) # 备注下 str 也会调用__str__ 哦!!!!! str(p) print("over") # 输出结果 # over # del run
str函数或者print函数--->obj.__str__()
repr或者交互式解释器--->obj.__repr__()
若是__str__没有被定义,那么就会使用__repr__来代替输出
注意:这俩方法的返回值必须是字符串,不然抛出异常函数
class School: def __init__(self, name, addr, type): self.name = name self.addr = addr self.type = type def __repr__(self): return 'School(%s,%s)' % (self.name, self.addr) def __str__(self): return '(%s,%s)' % (self.name, self.addr) s1 = School('oldboy1', '北京', '私立') print('from repr: ', repr(s1)) # 输出结果 # from repr: School(oldboy1,北京) print('from str: ', str(s1)) # 输出结果 # from str: (oldboy1,北京) print(s1) # 输出结果 # (oldboy1,北京) s1 # jupyter属于交互式 # 输出结果 # School(oldboy1,北京)
__format__ 方法能够用来我的呢根据已有格式来定制输出格式,不太经常使用(我的以为了解便可)code
date_dic={ 'ymd':'{0.year}:{0.month}:{0.day}', 'dmy':'{0.day}/{0.month}/{0.year}', 'mdy':'{0.month}-{0.day}-{0.year}', } class Date: def __init__(self,year,month,day): self.year=year self.month=month self.day=day def __format__(self, format_spec): if not format_spec or format_spec not in date_dic: format_spec='ymd' fmt=date_dic[format_spec] return fmt.format(self) d1=Date(2016,12,29) print(format(d1)) print('{:mdy}'.format(d1))
输出结果:
2016:12:29
12-29-2016
orm
我的总结:
二者区别嘛都上上面各自特色啦~~~
通常都只会用到一种咯,那就是 __str__
__str__ 更可能是给用户者的,而 _\repr__ 更多的是提供给程序员的
__format__ 也能够直接format调用,但不少时候都只是装饰数据做用,不太经常使用
对此有些时候 能够用 __repr__ = __str__ 意思为把__repr__指向__str__方法, 对 你猜的没错,这二者就同样啦,都为__str__方法,避免了方法重复意外出错对象