【发布时间】:2019-03-20 18:07:11
【问题描述】:
我认为下面的代码会导致错误,因为据我所知,Python 类中的方法必须将“self”(或任何其他标签,但按照约定为“self”)作为其第一个参数,如果使用 @classmethod 装饰器,则为“cls”或类似参数,如果使用 @staticmethod 装饰器,则无参数。
即使test_method 不满足这些要求,为什么我在终端中使用 Python 3.5 运行它时不会出错?作为静态方法,它似乎可以正常工作,但没有装饰器。
#!/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))
输出:
$ python3 testscript.py "testing"
$ testing
编辑:
我的问题也可以用不同的方式表达,将注意力从self 和@staticmethod 转移到:“我怎么会在没有@staticmethod 装饰器的情况下得到一个看似有效的静态方法?”
【问题讨论】:
-
简短的回答是:在创建类的实例之前,它不是一种方法。它只是一个函数。试试 MyClass().text_method('test') 会报错。
-
@Jblasco 如果不是一个方法而只是一个函数,那么它与使用装饰器声明的静态方法有什么区别?
-
也许这个问题的答案,你的query
-
可以从类的实例@Theod'Or 访问方法。换句话说,这不能从实例中使用,只能从类本身中使用。
标签: python class methods static-methods class-method