__str__,__repr__,__format__
- 改变对象的字符串显示
__str__
,__repr__
- 自定制格式化字符串
__format__
#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'
format_dict={
'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型
'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址
'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名
}
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)
def __format__(self, format_spec):
# if format_spec
if not format_spec or format_spec not in format_dict:
format_spec='nat'
fmt=format_dict[format_spec]
return fmt.format(obj=self)
s1=School('oldboy1','北京','私立')
print('from repr: ',repr(s1)) #输出:from str: (oldboy1,北京)
print('from str: ',str(s1)) #输出:print('from repr: ',repr(s1))
print(s1) #输出:(oldboy1,北京)
#如果没有__str__ ,__repr__
print(s1) #输出:<__main__.School object at 0x02D4CE10>
‘’’
str函数或者print函数-
–>obj.str()
repr或者交互式解释器
—>obj.repr()
如果__str__
没有被定义,那么就会使用__repr__
来代替输出,同时存在的时候,首先调用__str__
注意:这俩方法的返回值必须是字符串,否则抛出异常
‘’’
# 自定义是输出格式
print(format(s1,'nat'))
print(format(s1,'tna'))
print(format(s1,'tan'))
print(format(s1,'asfdasdffd'))
自定义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
issubclass和isinstance
#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'
class A:
pass
class B(A):
pass
print(issubclass(B,A)) #B是A的子类,返回True
a1=A()
print(isinstance(a1,A)) #a1是A的实例