为什么这个修饰符调用“TypeError:make\u sandwich()只接受2个参数(给定1个)”

2024-05-19 20:11:59 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我开始搞乱类和修饰符,但我似乎无法克服这个错误:TypeError:make\u sandwich()只接受2个参数(给定1个)

我试着在课余时间做所有的事情,但都奏效了。有什么办法让我的三明治机工作吗?在

class SandwichMaker:
    def __init__(self):
        self.sandwich = []
        self.bread = "========"
        self.bacon = " ~~~~~~ "
        self.olives = " oooooo "

    def make_sandwich(self, insides):
        def add_bread():
            self.sandwich.insert(0, self.bread)
            insides()
            self.sandwich.append(self.bread)
        return add_bread

    def add_bacon(self):
        return self.bacon

    def add_olives(self):
        return self.olives

    @make_sandwich
    def print_sandwich(self):
        for i in range(len(self.sandwich)):
            print self.sandwich[i]

my_sandwich = SandwichMaker()
my_sandwich.add_olives()
my_sandwich.add_bacon()
my_sandwich.print_sandwich()

编辑:嘿,所以多亏了答案我才修好了。如果有人想买一台能正常工作的无意义三明治打印机,以下是最终版本:

^{pr2}$

Tags: selfaddmakereturnmydef错误修饰符
2条回答
@make_sandwich
def print_sandwich(self):
    …

当您使用这样的decorator语法时,只有函数被传递给decorator。因此make_sandwich只接收一个参数。但正如错误所说,只需要两个。在

所以您需要将make_sandwich更改为只接受函数引用,而不是隐式的self,后者是三明治实例。在

一旦您这样做,您将遇到另外两个问题:从make_sandwich返回的函数不接受任何参数,因此当您调用修饰的print_sandwich时,隐式{}被传递,但函数不接受任何参数。因此,您需要更改内部函数以获取implictself。最后一个问题是修饰函数将在没有隐式self的情况下被调用。所以您需要将其称为insides(self)来解决这个问题。在

装饰者应该看起来像这样:

^{pr2}$

看看下面的答案:Python class method decorator w/ self arguments?Python decorators in classes

如果我了解您的目标,我建议采用以下(总结)方法:

class SandwichMaker:
  def make_sandwich(func):
    def inner(self):
        print("do before")
        func(self)
        print("do after")
    return inner

  @make_sandwich
  def print_sandwich(self):
    print("foo")

s = SandwichMaker()
s.print_sandwich()

相关问题 更多 >