Python中定义类方法的多种方法?

在《深入Python》中,Mark Pilgrim说:

When defining your class methods, you must explicitly list self as the first argument for each method

然后他用代码给出了一些例子:

1
2
3
4
5
6
def clear(self): self.data.clear()
def copy(self):
    if self.__class__ is UserDict:
        return UserDict(self.data)
    import copy
    return copy.copy(self)

在网上浏览一些Python代码时,我遇到了@classmethod装饰器。例如:

1
2
3
4
class Logger:
    @classmethod
    def debug(msg):
        print"DEBUG:" + msg

(注意,在debug函数中没有self参数)

使用self作为第一个参数定义类方法和使用@classmethod装饰器有什么区别吗?如果没有,定义类方法的一种方法是否比另一种方法更常用/首选?


@classmethod与定义实例方法不同。使用@classmethod定义的函数接收类作为第一个参数,而不是接收特定实例的实例方法。有关更多信息,请参阅这里的Python文档。


自我不是也永远不会是隐式的。

"自我不会变得含蓄。

有明确的自我是一件好事。它通过消除变量解析方式的模糊性,使代码更加清晰。它也使得函数和方法之间的差别很小。"

http://www.python.org/dev/peps/pep-3099/