如果在没有 class-body 的情况下调用静态方法,为什么会出现 TypeError?

Why I got TypeError if calling staticmethod without class-body?

为什么会这样?这是“绑定行为”吗? 在 class body

中使用静态方法
>>> class Test:
    
         @staticmethod
         def test(msg="asd"):
             print(msg)
        
>>> test = Test()
>>> test.test()
asd

但是当我不使用它时,出现错误:

>>> @staticmethod
    def test(msg=""):
         print(msg)
    
>>> test
<staticmethod object at 0x10dde9be0>
>>> test()
Traceback (most recent call last):
  File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydevd_bundle/pydevd_exec2.py", line 3, in Exec
    exec(exp, global_vars, local_vars)
  File "<input>", line 1, in <module>
TypeError: 'staticmethod' object is not callable

使用独立函数。

def test(msg=""):
    print(msg)

静态方法是一种绑定到 class 但不需要 class 实例即可运行的方法。 例如,您可能有一个围绕文件类型构建的 class 来从源文件中检索原始数据并将其传递给词法分析器,您的构造函数可以让您传入原始文件,但是您可能希望打开另一个函数文件,对其进行验证并检索数据。在这种情况下,您可以在 class 中使用静态函数,因为该函数与 class 相关但不需要 class 来运行(在这种情况下它会 return 实际 class).

代码示例:


class PythonFile:

   def __init__(self, raw_data):

      self._raw_data = raw_data
      self._lexer = None

   @staticmethod
   def open(fp):
      with open(fp, "r") as rFile:
         data = rFile.read()
      # validate, etc...
      return PythonFile(data)

   def lex(self):
      self._lexer = PythonLex(self._raw_data)
      return self._lexer.get_master_block_array()

# etc, etc...

python_file = PythonFile.open("some\path.py")
print(python_file.lex())

ItzTheDodo.