7.類特殊成員

jason8826發表於2024-05-10
# __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)))
'''

相關文章