1. 程式人生 > 其它 >內建函式之 __len__ __new__ __call__ __str__

內建函式之 __len__ __new__ __call__ __str__

  1 # 內建方法
  2 """
  3 1.__call__ 相當於 物件加()
  4 2.__len__ len(obj)
  5 3.__new__ 特別重要 開闢記憶體空間 類的構造方法
  6 4.__str__ str(obj)
  7 所有的雙下方法 沒有需要你外部直接呼叫的
  8 而是總是有一些其他的 內建函式 特殊的語法,來自動觸發這些 雙下方法
  9 """
 10 """
 11 #__名字__
 12         #類中的特殊方法\內建方法
 13         #雙下方法
 14         #魔術方法
 15 # 類中的每一個雙下方法都有它自己的特殊意義
16 #__call__ flask 17 #__new__ (特別重要) 18 寫一個單例類******* 19 # __len__ 20 # __str__\ __repr__ 21 """ 22 23 24 class A: 25 def __call__(self, *args, **kwargs): 26 print('執行call方法') 27 28 29 class B: 30 def __init__(self, cls): 31 print('在A例項化之前做一些事情
') 32 self.a = cls() 33 self.a() 34 print('在A例項化之後做一些事情') 35 36 37 # a = A() 38 # a() # 物件加括號 相當於呼叫__call__方法 39 # # 相當於 a = A()() 類名()() 相當於 例項化得到物件再對物件加括號 40 41 B(A) 42 43 44 # __len__方法 45 # len() dict\tuple\list\set 46 # __iter__ __next__ 47 # iter(obj) next()
48 49 50 # 內建函式和類的內建方法是有關係的 51 class mylist: 52 def __init__(self): 53 self.lst = [1, 2, 3] 54 self.name = 'alex' 55 self.age = 83 56 57 def __len__(self): 58 print('執行了__len__了') 59 return len(self.__dict__) 60 61 62 l = mylist() 63 print(len(l)) # len(obj)相當於呼叫這個obj__len__方法 64 65 66 # __len__方法return的值就是len的返回值 67 # 如果一個obj物件沒有__len__方法,那麼len函式會報錯 68 # print(l.lst) 69 # def iter(obj): 70 # return obj.__iter() 71 # 72 # l = [1,2,3] 73 # iter(l) 74 # # 實現一個類 self.s= ' ' 75 # len(obj) str的長度 76 class A: 77 def __init__(self, str): 78 self.str = str 79 80 def __len__(self): 81 return len(self.str) 82 83 84 s = A('sab') 85 print(len(s)) 86 87 88 # __new__ # 構造方法 89 90 # __init__ # 初識化方法 91 class Single: 92 def __new__(cls, *args, **kwargs): 93 obj = object.__new__(cls) 94 print('在new方法裡面', obj) 95 return obj 96 97 def __init__(self): 98 print('在init方法裡面', self) 99 100 101 # 1.開闢一個空間,屬於物件 102 # 2.把物件空間傳給self,執行init 103 # 3.將這個物件的空間返回給呼叫者 104 105 a = Single() 106 107 108 # 先呼叫single的new方法,single沒有,只能呼叫object的new方法 109 # new方法 什麼時候執行?? 110 # 例項化之後,在init之前,先執行new來建立一開空間 111 112 # 寫出一個單例類 113 114 # 單例 115 # 如果一個類,從頭到位只能一個例項,說明從頭到尾就開闢了一個空間,那麼這個類就只能一個單例類 116 class A: pass 117 118 119 # 單例類 120 class Single: 121 __isinstance = None 122 123 def __new__(cls, *args, **kwargs): 124 if not cls.__isinstance: 125 cls.__isinstance = object.__new__(cls) 126 return cls.__isinstance 127 128 def __init__(self, name, age): 129 self.name = name 130 self.age = age 131 132 133 s1 = Single('alex', 83) 134 s2 = Single('taibai', 40) 135 print(s1.name) 136 print(s2.name) 137 # __str__ 138 l = [1, 2, 3] # 例項化一個list物件 139 # l 是一個物件 140 print(l) 141 142 143 class Student: 144 def __str__(self): 145 return f'{self.school} {self.cls} {self.name}' 146 147 def __init__(self, name, stu_cls): 148 self.school = 'oldboy' 149 self.name = name 150 self.cls = stu_cls 151 152 153 he = Student('hezewei', 'py14') 154 huang = Student('huangdongyang', 'py14') 155 print(he) 156 print(str(he)) # 內建的資料型別,內建的列類,相當於執行__str__ 157 print(f'學生1: {he}') 158 # print一個物件相當於呼叫一個物件的__str__方法 159 # str(obj),相當於執行obj__str__方法 160 # 格式化輸出 也相當於執行__str__方法 161 """ 162 1.__call__ 相當於 物件加() 163 2.__len__ len(obj) 164 3.__new__ 特別重要 開闢記憶體空間 類的構造方法 165 4.__str__ str(obj) 166 所有的雙下方法 沒有需要你外部直接呼叫的 167 而是總是有一些其他的 內建函式 特殊的語法,來自動觸發這些 雙下方法 168 """