簡體   English   中英

Python 裝飾類

[英]Python decorating class

我試圖用參數裝飾一個class ,但無法讓它工作:

這是裝飾器:

 def message(param1, param2):
   def get_message(func):
        func.__init__(param1,param2)

   return get_message

我想放置裝飾器的類

@message(param1="testing1", param2="testing2")
class SampleClass(object):
   def __init__(self):
     pass

但這不起作用,運行此程序時出現錯誤。 有誰知道問題是什么?,我正在嘗試創建一個裝飾器來初始化具有某些值的類。

我無法弄清楚您要做什么。 如果你想用一個帶參數的裝飾器來裝飾一個類,一種方法是這樣的。

2020-09-03:

感謝 Maria-Ines Carrera 指出原始代碼實際上並沒有正確處理從其他類繼承的類,並且 user2357112 支持 Monica 提出一個可行的解決方案。

# function returning a decorator, takes arguments
def message(param1, param2):
    # this does the actual heavy lifting of decorating the class
    # it takes the original class, modifies it in place, and returns
    # the same class
    def wrapper(wrapped):
        the_init = wrapped.__init__

        def new_init(self):
            self.param1 = param1
            self.param2 = param2
            the_init(self)

        def get_message(self):
            return "message %s %s" % (self.param1, self.param2)

        wrapped.__init__ = new_init
        wrapped.get_message = get_message

        return wrapped
    return wrapper


class Pizza(object):
    def __init__(self):
        print "Pizza initialization"


@message("param1", "param2")
class Pizza2(Pizza):
    def __init__(self):
        print "Pizza2 initialization"
        super(Pizza2, self).__init__()

pizza_with_message = Pizza2()

# prints "message param1 param2"
print pizza_with_message.get_message()

這將打印以下內容:

Pizza2 initialization
Pizza initialization
message param1 param2

暫無
暫無

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

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