当前位置: 首页 > 面试题库 >

Python装饰器作为静态方法

苏彦君
2023-03-14
问题内容

我正在尝试编写一个使用装饰器函数的python类,该装饰器函数需要实例状态的信息。这可以按预期工作,但是如果我将装饰器明确设为staticmetod,则会出现以下错误:

Traceback (most recent call last):
  File "tford.py", line 1, in <module>
    class TFord(object):
  File "tford.py", line 14, in TFord
    @ensure_black
TypeError: 'staticmethod' object is not callable

为什么?

这是代码:

class TFord(object):
    def __init__(self, color):
        self.color = color

    @staticmethod
    def ensure_black(func):
        def _aux(self, *args, **kwargs):
            if self.color == 'black':
                return func(*args, **kwargs)
            else:
                return None
        return _aux

    @ensure_black
    def get():
        return 'Here is your shiny new T-Ford'

if __name__ == '__main__':
    ford_red = TFord('red')
    ford_black = TFord('black')

    print ford_red.get()
    print ford_black.get()

而且,如果我只删除该行@staticmethod,一切都会正常,但是我不明白为什么。它不应该self作为第一个论点吗?


问题答案:

这不是staticmethod应该使用的方式。
staticmethod对象是返回包装对象的描述符,因此它们仅在以身份访问时才起作用classname.staticmethodname。例

class A(object):
    @staticmethod
    def f():
        pass
print A.f
print A.__dict__["f"]

版画

<function f at 0x8af45dc>
<staticmethod object at 0x8aa6a94>

在的范围内A,您将始终获得后一个对象,该对象不可调用。

我强烈建议将装饰器移至模块作用域-
它似乎不属于类内部。如果您想将其保留在类中,请不要将其设置为staticmethod,而应将其简单地del放在类主体的末尾-在这种情况下,不应在类外部使用它。



 类似资料:
  • 问题 你想给类或静态方法提供装饰器。 解决方案 给类或静态方法提供装饰器是很简单的,不过要确保装饰器在 @classmethod 或 @staticmethod 之前。例如: import time from functools import wraps # A simple decorator def timethis(func): @wraps(func) def wrapp

  • 问题内容: 尽管有很多关于将类用作装饰器的资源,但我找不到能处理装饰 方法 问题的资源。这个问题的目的是解决这个问题。我将发布自己的解决方案,但是当然也邀请其他所有人发布他们的解决方案。 标准装饰器类实现的问题是python不会创建装饰函数的绑定方法: 方法装饰者需要克服这一障碍。 要求 以前面示例中的类为例,预期将完成以下工作: 理想情况下,函数和签名以及类似属性也应保留。 问题答案: 通常,当

  • 问题内容: 我正在尝试学习装饰器。我了解它的概念,现在尝试实现它。 这是我编写 的代码,代码不言自明。它只是检查参数是否传入。 抛出错误的说法。我了解它未在下定义,但不知道如何纠正此代码?我要去哪里错了? 问题答案: 您的装饰器应如下所示: 需要注意的几点: 期望将类作为第一个参数(您可以将其替换为简单的try / except TypeError除外)。 包装器应返回一个函数,而不是被调用函数的

  • 本文向大家介绍基于Python 装饰器装饰类中的方法实例,包括了基于Python 装饰器装饰类中的方法实例的使用技巧和注意事项,需要的朋友参考一下 title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] category: ['Python'] --- 目前在中文网

  • 问题内容: 我想了解内置功能的工作原理。令我感到困惑的是,它还可以用作装饰器,但是仅当用作内置函数时才接受参数,而不能用作装饰器。 这个例子来自文档: 的论点是和文档字符串。 在下面的代码中用作装饰器。它的对象是函数,但是在上面的代码中,参数中没有对象函数的位置。 并且,和装饰器是如何创建的?我很困惑。 问题答案: 该函数返回一个特殊的描述符对象: 正是这种对象有额外的方法: 这些充当装饰过。他们

  • 问题内容: 我很好奇为什么我们需要装饰器将method声明为。我正在阅读有关Python中的静态方法的信息,并且我知道静态方法可以在不实例化其类的情况下被调用。因此,我尝试了下面的两个示例,但是两者都相同: 如果我直接在类上调用该方法,则都将打印/显示以下值: 问题答案: 如果您打算尝试从类的实例而不是直接从类的实例调用,则需要装饰器 现在,如果我宣布该参数不隐式传递作为第一个参数