是否有必要在定义时装饰类方法?

Is it neccessary to decorate a classmethod at it's definition?

在Python的OOP概念中一共有三种方法——实例方法、class方法和静态方法。

class MyClass:
    def instancemethod(self):
        return 'instance method called'

    @classmethod
    def classmethod(cls):
        return 'class method called'

    @staticmethod
    def staticmethod():
        return 'static method called'

三个方法都知道是显而易见的。现在我在 class:

中创建了一个新方法
class Test():
    def ppr():
        print('what method is ppr?')

不是实例方法。

inst = Test()
inst.ppr()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ppr() takes 0 positional arguments but 1 was given

所以这是一个class方法?

Test.ppr()
what method is ppr?

没有 @classmethod 关键字来修饰 ppr 函数。

让我们测试一下:

class MyClass:
    def instancemethod(self):
        return 'instance method called'

    @classmethod
    def classmethod(cls):
        return 'class method called'

    @staticmethod
    def staticmethod():
        return 'static method called'

class Test():
    def ppr():
        print('what method is ppr?')

print(type(MyClass.instancemethod)) # -> function
print(type(MyClass.classmethod))    # -> method
print(type(MyClass.staticmethod))   # -> function 

print(type(Test.ppr))               # -> function 

因为 Test.ppr 作为 函数 返回并且它可以是 运行 而无需创建实例 - 它是 @staticmethod

如果它是 @classmethod - 它会返回类型 method.

q.e.d.


我的 IDE 向我显示警告:'Method ppr has no argument.' 提示您可能应该添加 selfcls 以及相应的 @classmethod

回答您的问题 - 似乎不需要(此时) - 但谨慎声明它们 @staticmethod 以明确您的意图。

对于普通的静态方法,它可以被class或实例调用。

#called by class 
MyClass.staticmethod()
'static method called'
#called by instance
MyClass().staticmethod()
'static method called'

Testclass中的方法是非标准的static method

Test.ppr()
what method is ppr?
Test().ppr()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ppr() takes 0 positional arguments but 1 was given