# __new__()方法 class Foo(): def __new__(cls,a): print("__new__():",a) instance = super().__new__(cls) # __new__是傳入類cls,返回一個例項物件 return instance def __init__(self,b): # __init__傳入例項物件self print("__init__():",b) test1 = Foo("abc") # __new__的返回值正是__init__中self # __del__()方法,銷燬例項化物件 class Demo1: def __init__(self): print("呼叫__init__構造物件") def __del__(self): print("呼叫__del__銷燬物件") demo1 = Demo1() del demo1 # __dir__()方法,檢視物件擁有的屬性名和方法名 class Demo2: a = 1 b = 2 def __init__(self): self.name = "kbqlm" def say(self): pass demo2 = Demo2() print(dir(demo2)) print(demo2.__dir__()) # __dict__屬性,檢視物件內部所有的屬性名和屬性值組成的字典 print(demo2.__dict__) # hasattr(obj, name)判斷例項物件是否包含指定名稱的屬性或方法 class Demo3: a = 1 b = 2 def __init__(self): self.name = "kbqlm" def say(self): pass demo3 = Demo3() print(hasattr(demo3,"a")) print(hasattr(demo3,"name")) print(hasattr(demo3,"say")) # getattr(obj, name[, default])獲取例項物件中指定屬性的值,如果找不到指定的name,則返回default print(getattr(demo3,"a")) print(getattr(demo3,"name")) # setattr(obj, name, value)修改例項物件中屬性的值 setattr(demo3,"a","1_") setattr(demo3,"name","kbqlm_") print(demo3.a) print(demo3.name) # __call__()方法 class Demo4: def __init__(self,name): print("執行__init__:",name) def __call__(self,name,age): print("執行__call__:",name,age) demo4 = Demo4('kbq1') demo4("kbq2",18) # 使得例項物件可以向呼叫普通函式那樣,以“物件名()”的形式使用 demo4.__call__("kbq2",18) # 生成器函式,相比迭代器,生成器最明顯的優勢就是節省記憶體空間,即它不會一次性生成所有的資料,而是什麼時候需要,什麼時候生成 # 條件1:定義一個以yield關鍵字標識返回值的函式 # 條件2:呼叫剛剛建立的函式,即可以建立一個生成器 # 效果:呼叫生成器函式,python直譯器不會執行函式中的程式碼,它只會返回一個生成器(物件) def Num(): print("開始執行") for i in range(5): yield i # 和return相比,yield除了返回相應的值,還會在程式執行完該語句時,程式就會暫停執行 print("繼續執行") num1 = Num() # 想要使生成器函式執行 # 方法1:呼叫__next__()方法 print('呼叫__next__()',num1.__next__()) print('呼叫__next__()',num1.__next__()) # 方法2:呼叫for迴圈遍歷生成器 for i in num1: print('呼叫for迴圈',i) # 方法3:將num1轉換成列表或者元組 # list(num1)或tuple(num1) # @函式裝飾器 def funA(fun): print("1111") fun() print("3333") return "裝飾器函式的返回值" @funA # 相當於funA(funB) def funB(): print("2222") # 帶引數的裝飾器 def funA(fun): def say(obj): print("定義的巢狀函式輸出:",obj) return say @funA # 相當於funB = funA(funB) def funB(arc): pass funB("引數") # 裝飾器巢狀 ''' @funA @funB @funC def fun() # 相當於funA(funB(funC(fun))) '''