python3中@staticmethod的好处?

python3中@staticmethod的好处?,python,python-3.x,static-methods,Python,Python 3.x,Static Methods,我有一个简单的问题:为什么在静态方法上使用staticmethod装饰器?您可以创建没有“self”参数的静态方法,而无需此装饰器 使用python2时,有必要: >>> class A: ... def p(object_to_print): ... print(object_to_print) ... >>> A.p('test') Traceback (most recent call last): File "<stdin>",

我有一个简单的问题:为什么在静态方法上使用staticmethod装饰器?您可以创建没有“self”参数的静态方法,而无需此装饰器

使用python2时,有必要:

>>> class A:
...  def p(object_to_print):
...   print(object_to_print)
... 
>>> A.p('test')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method p() must be called with A instance as first argument (got str instance instead)
>>A类:
...  def p(对象到打印):
...   打印(对象到打印)
... 
>>>A.p(“测试”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:必须以实例作为第一个参数调用未绑定的方法p()(改为使用str instance)
但是,如果我使用Python3做完全相同的事情,它会工作得很好

如果没有装饰就可以很好地工作,为什么要使用它呢?如果第一个参数没有命名为self,那么很明显它是一个静态方法。我能看到的唯一原因是在误用的情况下得到更清楚的错误

在Python3中出现这种行为有什么原因吗

谢谢:)
palkeo.

尝试使用
A
的实例调用此方法,您将得到一个异常:

>>> a = A()
>>> a.p('test')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: p() takes 1 positional argument but 2 were given

Python2中也有
@staticmethod
decorator。静态方法也可以用于实例,而不仅仅是类。我知道它是可用的,对于Python2,您必须使用它:如果您没有得到我提到的错误。但是,在Python3中不使用它的原因是什么?这更多是我的问题,因为在Python3中取消了未绑定方法的概念。它在Python2中没有提供任何有用的东西。因此,您只需使用Python 3中的原始函数即可。好的,这是另一个区别。还有其他原因吗?特别是两个python版本之间的行为差异。
>>> a.p()
<__main__.A object at 0x7f9f60f56048>
>>> A.p('test')
test
>>> a.p('test')
test