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

我们是否真的需要python中的@staticmethod装饰器来声明静态方法

谭梓
2023-03-14
问题内容

我很好奇为什么我们需要@staticmethod装饰器将method声明为static。我正在阅读有关Python中的静态方法的信息,并且我知道静态方法可以在不实例化其类的情况下被调用。因此,我尝试了下面的两个示例,但是两者都相同:

class StatMethod:
  def stat():
    print("without Decorator")

class StatMethod_with_decorator:
  @staticmethod
  def stat():
    print("With Decorator")

如果我stat()直接在类上调用该方法,则都将打印/显示以下值:

>> StatMethod.stat()
without Decorator
>> StatMethod_with_decorator.stat()
With Decorator

问题答案:

如果您打算尝试@staticmethod从类的实例而不是直接从类的实例调用,则需要装饰器

class Foo():
    def bar(x):
        return x + 5

>>> f = Foo()
>>> f.bar(4)
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    f.bar(4)
TypeError: bar() takes 1 positional argument but 2 were given

现在,如果我宣布@staticmethodself参数不隐式传递作为第一个参数

class Foo():
    @staticmethod
    def bar(x):
        return x + 5

>>> f = Foo()
>>> f.bar(4)
9


 类似资料:
  • 问题内容: 我正在尝试编写一个使用装饰器函数的python类,该装饰器函数需要实例状态的信息。这可以按预期工作,但是如果我将装饰器明确设为staticmetod,则会出现以下错误: 为什么? 这是代码: 而且,如果我只删除该行,一切都会正常,但是我不明白为什么。它不应该作为第一个论点吗? 问题答案: 这不是应该使用的方式。 对象是返回包装对象的描述符,因此它们仅在以身份访问时才起作用。例 版画 在

  • 问题内容: 在Linux上的“ C”上, 我需要静态库来静态链接,还是需要足够的共享库?如果没有,为什么不呢?(它们不包含相同的数据吗?) 问题答案: 是的,您需要静态库来构建静态链接的可执行文件。 静态库是编译对象的捆绑包。静态链接到库时,实际上与获取该库的编译结果,将它们解压缩到当前项目中以及将它们当作自己的对象使用一样。 动态库已链接。这意味着一些信息,例如重定位,已经被修复并丢弃。 此外,

  • 问题内容: 我想和詹金斯建立声纳。但是我不确定Sonar网站是否描述了两种不同的方法来执行此操作,或者是否有两个必要步骤: 据我了解,这是两种不同的方式。如果是这样的话,(Sonar本身和Sonar跑步者之间)有什么区别以及优点和缺点是什么? 问题答案: 如果要使用SonarQube和Jenkins分析项目,则需要满足以下条件: SonarQube服务器启动并运行 安装并运行SonarQube S

  • 问题内容: 我有一个快速的问题。在静态关键字声明之后立即开始的代码块,那是什么类型的方法?我从未见过。如果有人能启发我,将不胜感激。谢谢。 问题答案: 这不是方法,而是类的静态Initializer块。您可以在Java Language Specification中 阅读有关它的更多信息。 加载该类后,其中的代码将执行一次。

  • 问题内容: 为什么编译器没有在开关中的每个代码块之后自动放置break语句?是出于历史原因吗?您何时要执行多个代码块? 问题答案: 有时将多个案例与同一代码块关联会很有帮助,例如 等。只是一个例子。 以我的经验,通常“摔倒”并在一种情况下执行多个代码块是不好的风格,但是在某些情况下可能会有用处。

  • 方法 B 怎么使用方法 A 作为装饰器呢? 这样貌似不行,该如何解决