day29 類中的內建函式方法 __str__ __repr__ __call__ isinstance() issubclass()
阿新 • • 發佈:2018-11-09
__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 # 這裡不些括號也行 8del(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 # 被檢查是否是父類的放在後面