【问题标题】:Define a staticmethod outside of class definition?在类定义之外定义一个静态方法?
【发布时间】:2022-01-07 15:28:11
【问题描述】:

问题

我有一些方法,我想直接在一个类之外使用它们,并将它们分组到一些不同的类中。

如何在类定义之外定义方法已经得到正确回答:

但是,我没有发现任何关于静态方法的信息。

最好的方法是什么?

我的方法

对于这样的类:

class some_class:

   @staticmethod
   def some_haevy_method(...):
      ...

我尝试了以下方法:

装饰器


def some_haevy_method(...):
      ...

class some_class:

   @staticmethod
   some_haevy_method = some_haevy_method

无法编译:SyntaxError: invalid syntax

更换


def some_haevy_method(...):
      ...

class some_class:

   @staticmethod
   def some_haevy_method(...):
      pass

   some_haevy_method = some_haevy_method

错误:some_haevy_method () takes 0 positional arguments but 1 was given(装饰器被覆盖,self 被传递)

重新定义


def some_haevy_method(...):
      ...

class some_class:

   @staticmethod
   def some_haevy_method(*args, **kwargs):
      return some_haevy_method(*args, **kwargs)


这确实有效,但缺点是文档和类型提示不可用。

我的用例

编辑:因为它是在 cmets 中询问的。

我想直接在脚本中使用我的some_haevy_method,甚至不知道类。 它也会出现在某些类中。这个班有孩子,孩子们有其他孩子。他们每个人都应该能够提供这个功能。

这可能是有点懒惰的编码,因为在这个例子中我的类是更多的主题分组方法,但它对我的项目有帮助。比如我在调试的时候,不用每次都加载具体的方法。

请随意在 cmets 中烤我 :)

【问题讨论】:

  • 如果你已经有了全局函数,那么定义静态方法似乎完全没有必要。
  • 为什么要在类之外有一个静态函数?
  • @chepner:我想通过类使用它,而不是每次都重新加载特定的函数。我将更新一些示例用法。
  • @Robert 为什么不呢?这个特定的方法可以在不知道类的情况下从其他模块中使用。
  • 没有重新加载。任何你会使用some_class.some_heavy_method 的地方,你都可以很容易地使用some_heavy_method。静态方法的实际用例相当少见。

标签: python


【解决方案1】:

装饰器语法仅用于函数和类定义,但仅在这些情况下必需以避免名称重复。语法只是赋值的捷径,所以你可以写

def some_heavy_method(...):
      ...

class some_class:    
    some_heavy_method = staticmethod(some_heavy_method

装饰器语法总是为了方便;没有它,你总是可以简单地写

class some_class:

    def f():
        ...

    f = staticmethod(f)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多