__repr__()

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__()方法

猜你喜欢

转载自www.cnblogs.com/long-holiday/p/9913641.html
今日推荐