先來看一段代碼:
class Person(): def __init__(self,name,age): self.name = name self.age = age person = Person('呂星辰',20) print(person) # 內存中的一個對象 <__main__.Person object at 0x0042A6A0>
輸出實例化的Person類,返回的是一個在內存中的對象;
當輸出person實例對象時,實際上輸出的是person對象上 __repr__ 方法的返回值
也就是說下邊兩個輸出的效果一樣 (內存地址相同) :
print(person) # <__main__.Person object at 0x0025A6A0> print(person.__repr__) # <method-wrapper '__repr__' of Person object at 0x0025A6A0>
原理: 即__repr__ 方法默認返回值的實現
class Person():
def __init__(self,name,age): self.name = name self.age = age def __repr__(self): return '<{0}.{1} object at {2}>'.format(self.__module__,type(self).__name__,hex(id(self))) person = Person('呂星辰',20) print(person) # <__main__.Person object at 0x5ba6a0>
重寫 __repr__ 方法
是Python類中的一個特殊方法,由object對象提供,由於所有類都是object類的子類,所以都會繼承該方法!!!
它是一個 ”自我描述“ 的方法,此方法通常實現這樣的功能: 當直接打印類的實例化對象時,系統將會輸出對象的自我描述信息,用來告訴外界對象具有的狀態信息。
但是由於object提供的這個 __repr__ 方法總是返回一個對象, ( 類名 + obejct at + 內存地址 ),這個值並不能真正實現自我描述的功能!!!
因此,如果你想在自定義類中實現 “自我描述” 的功能,那么必須重寫 __repr__ 方法:
class Person(): def __init__(self,name,age): self.name = name self.age = age def __repr__(self): return 'Person類,包含name='+self.name+'和age='+str(self.age)+'兩個實例屬性' person = Person('呂星辰',20) print(person) # Person類,包含name=呂星辰和age=20兩個實例屬性
上邊代碼,重寫了__repr__,打印person實例時,就可以返回類的 ”自我描述“ 的信息。