您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python中怎么使用裝飾器裝飾函數,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
***個函數deco是裝飾函數,它的參數就是被裝飾的函數對象。我們可以在deco函數內對傳入的函數對象做一番“裝飾”,然后返回這個對象(記住一定要返回 ,不然外面調用foo的地方將會無函數可用。
我寫了個小例子,檢查函數有沒有說明文檔:、
static PyObject* thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) { PyObject *func, *args, *keyw = NULL; struct bootstate *boot; long ident; PyArg_UnpackTuple(fargs, "start_new_thread", 2, 3, &func, &args, &keyw); //[1]:創建bootstate結構 boot = PyMem_NEW(struct bootstate, 1); boot->interp = PyThreadState_GET()->interp; boot->funcfunc = func; boot->argsargs = args; boot->keywkeyw = keyw; //[2]:初始化多線程環境 PyEval_InitThreads(); /* Start the interpreter's thread-awareness */ //[3]:創建線程 ident = PyThread_start_new_thread(t_bootstrap, (void*) boot); return PyInt_FromLong(ident); [thread.c] /* Support for runtime thread stack size tuning. A value of 0 means using the platform's default stack size or the size specified by the THREAD_STACK_SIZE macro. */ static size_t _pythread_stacksize = 0; [thread_nt.h] long PyThread_start_new_thread(void (*func)(void *), void *arg) {
Python裝飾器是裝飾函數,它的參數是用來加強“加強裝飾”的。由于此函數并非被裝飾的函數對象,所以在內部必須至少創建一個接受被裝飾函數的函數,然后返回這個對象(實際上此時foo=decomaker(arg)(foo))。
這個我還真想不出什么好例子,還是見識少啊,只好借用同步鎖的例子了:
def synchronized(lock): """鎖同步裝飾方法 !lock必須實現了acquire和release方法 """ def sync_with_lock(func): def new_func(*args, **kwargs): lock.acquire() try: return func(*args, **kwargs) finally: lock.release() new_func.func_name = func.func_name new_func.__doc__ = func.__doc__ return new_func return sync_with_lock @synchronized(__locker) def update(data): """更新計劃任務""" tasks = self.get_tasks() delete_task = None for task in tasks: if task[PLANTASK.ID] == data[PLANTASK.ID]: tasks.insert(tasks.index(task), data) tasks.remove(task) delete_task = task r, msg = self._refresh(tasks, delete_task) return r, msg, data[PLANTASK.ID]
調用時還是updae(data),同時還可以將多個裝飾器組合 使用:
def synchronized(lock): """鎖同步裝飾方法 !lock必須實現了acquire和release方法 """ def sync_with_lock(func): def new_func(*args, **kwargs): lock.acquire() try: return func(*args, **kwargs) finally: lock.release() new_func.func_name = func.func_name new_func.__doc__ = func.__doc__ return new_func return sync_with_lock @synchronized(__locker) def update(data): """更新計劃任務""" tasks = self.get_tasks() delete_task = None for task in tasks: if task[PLANTASK.ID] == data[PLANTASK.ID]: tasks.insert(tasks.index(task), data) tasks.remove(task) delete_task = task r, msg = self._refresh(tasks, delete_task) return r, msg, data[PLANTASK.ID]
關于Python中怎么使用裝飾器裝飾函數就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。