面向对象高阶-05__str__和__repr__和\_\_format\_\_
__str__
会在对象被转换为字符串时或print()时候,转换的结果就是这个函数的返回值
使用场景:我们可以利用该函数来自定义,对象的是返回值(一般人为为打印格式)
列子一
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
__repr__
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__
__format__ 方法可以用来个人呢根据已有格式来定制输出格式,不太常用(个人觉得了解即可)
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
个人总结:
两者区别嘛都上上面各自特点啦~~~
一般都只会用到一种咯,那就是 __str__
__str__ 更多是给用户者的,而 _\repr__ 更多的是提供给程序员的
__format__ 也可以直接format调用,但很多时候都只是装饰数据作用,不太常用
对此有些时候 可以用 __repr__ = __str__ 意思为把__repr__指向__str__方法, 对 你猜的没错,这两者就一样啦,都为__str__方法,避免了方法重复意外出错