【问题标题】:Multiple ways to define a class method in Python?在 Python 中定义类方法的多种方法?
【发布时间】:2012-10-21 23:47:05
【问题描述】:

在 Dive Into Python 中,Mark Pilgrim 说:

当定义你的类方法时,你必须显式地列出 self 作为每个方法的第一个参数

然后他在代码中给出了几个例子:

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 装饰器。一个例子是:

class Logger:
    @classmethod
    def debug(msg):
        print "DEBUG: " + msg

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

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

【问题讨论】:

标签: python class methods


【解决方案1】:

@classmethod 与定义实例方法不同。用@classmethod 定义的函数接收class 作为第一个参数,而不是接收特定instance 的实例方法。有关详细信息,请参阅 Python 文档here

【讨论】:

  • 谢谢!书中的句子现在更有意义了。我错过了他的观点,并认为他的意思是类方法(如静态方法),而他只指在类中定义的方法。因此,self 是对该类实例的引用,在使用 @classmethod 时显然不起作用,因为您没有实例:)
【解决方案2】:

self 不是,也永远不会是隐含的。

"self 不会变得隐含。

让自己明确是一件好事。它通过消除关于变量如何解析的歧义来使代码清晰。也让函数和方法的区别变小了。”

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

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 2014-04-18
    • 2015-08-25
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2013-10-02
    • 1970-01-01
    相关资源
    最近更新 更多