Python類相關的裝飾器


一、裝飾器裝飾類方法

from functools import wraps
def wrapper(func):
    @wraps(func)
    def inner(self,*args,**kwargs):
        # 此時的self是Person的實例對象
        self.name += "愛吃糖"
        # func ===>  printInfo
        ret = func(self,*args,**kwargs)
        return ret

    return inner


class Person(object):
    def __init__(self,name):
        self.name = name

    @wrapper
    def printInfo(self):
        print(self.name)

# printInfo ==> wraper(printInfo) ==> inner
Person("張三").printInfo()

# 張三愛吃糖

二、類裝飾器實現單例模式

def wrapper(obj):
    def inner(name,*args,**kwrags):
        if not obj.instance:
            obj.instance = obj(name)
        return obj.instance
    return inner

@wrapper
class Person(object):
    instance = None
    def __init__(self,name):
        self.name = name

    def printInfo(self):
        print(self.name)

zs = Person('張三')
zs.printInfo()
print(id(zs))

ls = Person('李四')
ls.printInfo()
print(id(ls))

三、給裝飾器寫log

import time
from functools import wraps

def log(func):
    @wraps(func)
    def inner(fun,*args,**kwargs):
        print("%s執行了"%(func))
        ret = func(fun)
        return ret
    return inner

@log
def wraper(func):
    @wraps(func)
    def inner(*args,**kwargs):
        start_time = time.time()
        ret = func()
        endtime = time.time() - start_time
        print(endtime)
        return ret
    return inner

@wraper
def func():
    time.sleep(5)
    print("func執行了")

# wraper(func) ==>log(wraper) ==>inner
# func() ==> wraper(func)==>inner
func()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM