我认为以下代码会导致错误,因为据我所知,Python 类中的方法必须将“self”(或任何其他标签,但按照约定为“self”)作为其第一个参数,或者“cls”或类似的如果@classmethod
使用装饰器,或者不使用装饰器@staticmethod
使用装饰器。
为什么我在终端中使用 Python 3.5 运行它时没有出现错误,即使test_method
不满足这些要求?作为静态方法,它似乎工作得很好,但没有装饰器。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
class MyClass:
def test_method(args):
print(args[1])
@staticmethod
def static_method():
print("static_method")
@classmethod
def class_method(cls):
print("class_method")
def main(args):
MyClass.test_method(args)
if __name__ == '__main__':
sys.exit(main(sys.argv))
Output:
$ python3 testscript.py "testing"
$ testing
EDIT:
我的问题也可以用不同的措辞来转移注意力self
and to @staticmethod
:“为什么我在没有 @staticmethod 装饰器的情况下得到了一个看似有效的静态方法?”
在Python 2中,类体中定义的函数会自动转换为“未绑定方法”,并且如果没有staticmethod装饰器则无法直接调用。在Python 3中,这个概念被删除了;MyClass.text_method
是一个简单的函数,位于 MyClass 命名空间内,可以直接调用。
仍然使用的主要原因staticmethod
在 Python 3 中,如果您还想在某个对象上调用该方法instance。如果不使用装饰器,该方法将始终将实例作为第一个参数传递,从而导致 TypeError。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)