簡體   English   中英

類內的python-Decorator函數

[英]python-Decorator function inside Class

我有以下代碼,如果我將自己從方法中刪除,則可以正常工作

class tests:
    def __init__(self):
        pass
    def func(self,a):
        def wrapp(x):
            y=x+2
            return a(y)
        return wrapp
    @func
    def func1(self,b):
        return b

print (tests.func1(10))

我相信裝飾器函數是返回另一個函數的函數。 那在課堂上行不通嗎? 忽略縮進錯誤,因為在將代碼粘貼到此處時無法實現。請幫助我如何在課堂中實現此方案。

您可以在類之外聲明裝飾器。 同樣,當裝飾一個類方法時,似乎需要將自變量從包裝器傳遞給裝飾的函數(為了更清晰起見,更改了名稱):

def add_two(fn):
    def wrapper(self, x):
        y = x + 2
        return fn(self, y) 
    return wrapper

class Test:
    @add_two
    def func1(self, b):
        return b

f = Test()
f.func1(5) # returns 7

這里的問題根本不是裝飾器。 此問題是您將func1和裝飾器用作靜態方法,而沒有刪除self參數。 如果刪除自變量,則可以正常工作。

沒有staticmethod裝飾器

class Test:
    def add_two(func=None):
        def wrapper_add_two(*args, **kwargs):
            return func(*args, **kwargs) + 2
        return wrapper_add_two

    @add_two
    def func1(b):
        return b

print(Test.func1(10)) #12

帶有staticmethod裝飾器

不幸的是,以這種方式使用它們將它們存儲為未綁定的靜態方法,並且您需要綁定它們才能使其正常工作。

class Test:
    @staticmethod
    def add_two(func):
        def wrapper_add_two(*args, **kwargs):
            return func.__func__(*args, **kwargs) + 2
        return wrapper_add_two

    @add_two.__func__
    @staticmethod
    def func1(b):
        return b

print(Test.func1(10)) #12

使用staticmethod裝飾器運行並且沒有函數綁定可以為您提供

TypeError:“靜態方法”對象不可調用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM