class A :
def __init__(self,name):
self.name=name
#def __str__(self):
# return '**%s**'%self.name
def __repr__(self):
return self.name
a=A('alex')
print(a)#类中没有__repr__()方法 也没有__str__()方法的时候 print(a)打印a对象的内存地址
#类中有了__repr__()方法后 没有__str__()方法 print(a) 打印alex
#类中有__str__()方法 也有__repr__()方法 打印 **alex**
print(str(a),repr(a))#str(obj)触发了__str__()方法 repr(obj)触发了 __repr__()方法
print('%s | %r'%(a,a))#%s触发了__str__()方法 %a触发了__repr__()方法
#print('----%r---'%('abc'))#r是'abc'
#结论:repr(obj)和%r 调用___repr__()方法
#str(obj) %s 调用__str__()方法
#__repr__()方法是__str__()方法的备胎。如果有__str__()方法,那么print('%s) str(obj)都先去执行__str__()方法,并且使用__str__()方法的返回值
#如果没有__str__()方法,那么print('%s') str(oj)都会执行__repr__()方法
#只有__str__()方法的时候 print(str(a),repr(a))打印的是 **alex** <__main__.A object at 0x007BB9B0>
#只有__str__()方法的时候 print('%s | %r'%(a,a))打印的是**alex** | <__main__.A object at 0x007BB9B0>
#只有__repr__()方法的时候 print(str(a),repr(a))打印的是alex alex
#只有__repr__()方法的时候 print('%s | %r'%(a,a))打印的是alex | alex
class A :
def __init__(self,name):
self.name=name
def __str__(self):
return '**%s**'%self.name
def __repr__(self):
return self.name
class B(A):
def __init__(self,name):
self.name=name
#def __str__(self):
# return '***'
def __repr__(self):
return '~~~~'
a=B('alex')
print(a)
print(str(a),repr(a))#当子类B中只有__init__()方法 print(str(a),repr(a))打印**alex** alex
print('%s |%r'%(a,a))#当子类B中只有__init__()方法 print('%s |%r'%(a,a))打印**alex** |alex
#当子类B中有__str__()方法 ,没有__repr__() print(str(a),repr(a))打印*** alex
#当子类B中有__str__()方法 ,没有__repr__() print('%s |%r'%(a,a))打印*** alex
#当子类B中有__repr__()方法,没有__str__() print(str(a),repr(a))打印**alex** ~~~~
#当子类B中有__repr__()方法,没有__str__() print("%s |%r'%(a,a))打印**alex** ~~~~
#----------结论:在子类中使用__str__()先找子类的__str__() 没有的话向上找,只要父类不是object,就执行父类的__str__()方法
#但是如果出了object之外的父类都没有__str__()方法,就执行子类的__repr__()方法,如果子类也没有,还要向上继续找父类中的__repr__()方法
#一直找不到 再执行object类中的__repr__()方法