如果在没有 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.
为什么会这样?这是“绑定行为”吗? 在 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.