1. 程式人生 > >day29 類中的內建函式方法 __str__ __repr__ __call__ isinstance() issubclass()

day29 類中的內建函式方法 __str__ __repr__ __call__ isinstance() issubclass()

__str__()
__repr__()
__len__()

str() 轉字串
repr()   讓字元原形畢露的方法
len() 計算長度

內建的方法很多,但是並不是全部都在object中,比如len(),__len__(),比如說數字,時間,還有物件都是無法計算長度
 1 # __del__         解構函式
 2 # 刪除,python直譯器本身也會自動刪除
 3 class A:
 4     def __del__(self):
 5         print("執行我啦")
 6 a = A()
 7 # del a        # 這裡不些括號也行
 8
del(a) # 即刪除了變數,又執行了這個方法,先執行後刪除 9 # 執行我啦 10 print(a) # NameError: name 'a' is not defined
__call__()  呼叫的本質
__str__()   把一個類的示例變成字串輸出(其實是為了輸出給客戶看的.更加的容易清晰的理解這個例項是個啥)
 1 class ABC():
 2     def __init__(self,name):
 3         self.name = name
 4     
 5     def aaa(self):
6 print(f"{self.name} is aaa") 7 return "aaa" 8 9 def __call__(self, *args, **kwargs): 10 print("it's working~~") 11 12 def __str__(self): 13 print("這是一個ABC的例項") # __str__返回值必須要有. 不然會報錯. 14 # TypeError: __str__ returned non-string (type NoneType)
15 return "這是一個ABC的例項"   16 17 a = ABC("yangtuo") # 例項化 18 19 # 直接對例項操作實際是操作的就是__call__()方法 20 a() # it's working~~ 21 22 # 在沒有__call__方法的時候直接列印這個例項會返回一段記憶體地址 23 # print(a) # <__main__.ABC object at 0x000000000258D240> 24 # 存在__call__方法的時候返回不會這麼死板 25 print(a) # 這是一個ABC的例項 26 27 a.aaa() # yangtuo is aaa 28 print(a.name) # yangtuo

內建函式類方法和內建的函式方法其實有很深的聯絡

簡單來說就是: 開發者看 repr 客戶看 str
為了保證一致性可以用只重寫__str__()並設定__repr__ = __str__,就可以保證上面使用方法的結果都是呼叫重寫的__str__()。

 1 >>> class Test():
 2     def __init__(self):
 3         self.prompt = "hello,zss041962"
 4 
 5 >>> t = Test()
 6 >>> t
 7 <__main__.Test object at 0x0000000002F3EF28>
 8 >>> print(t)
 9 <__main__.Test object at 0x0000000002F3EF28>
10 
11 # 看到了麼?上面列印類物件並不是很友好,顯示的是物件的記憶體地址
12 # 下面我們重構下該類的__repr__以及__str__,看看它們倆有啥區別
13 
14 >>> #重構__repr__
15 >>> class TestRepr(Test):
16     def __repr__(self):
17         return "Show:%s"%self.prompt
18 # 重構__repr__方法後,不管直接輸出物件還是通過print列印的資訊都按我們__repr__方法中定義的格式進行顯示了
19 >>> t1 = TestRepr()
20 >>> t1
21 Show:hello,zss041962
22 >>> print(t1)
23 Show:hello,zss041962
24 
25 
26 >>> #重構__str__
27 >>> class TestStr(Test):
28     def __str__(self):
29         return "Show:  %s"%self.prompt
30 # 你會發現,直接輸出物件ts時並沒有按我們__str__方法中定義的格式進行輸出,而用print輸出的資訊卻改變了
31 >>> t2 = TestStr()
32 >>> t2
33 <__main__.TestStr object at 0x00000000031C33C8>
34 >>> print(t2)
35 Show:  hello,zss041962
isinstance 檢查一個物件是不是一個類的物件
issubclass 檢查一個一個類是不是另一個類的子類
 1 # isinstance 檢查一個物件是不是一個類的物件
 2 # isinstance(obj,cls)
 3 class A():pass
 4 a = A()
 5 print(isinstance(a,A))    # True
 6 
 7 
 8 # issubclass 檢查一個一個類是不是另一個類的子類
 9 # issubclass(sub,super)
10 class A():pass
11 class B(A):pass
12 print(issubclass(B,A))    # True
13 # 這個順序有點難記憶, B是不是A 的子類?是就返回 T 不是返回 F 
14 # 被檢查是否是子類的放在前面
15 # 被檢查是否是父類的放在後面