类和实例方法之间的区别

Jam*_*mes 58 python

我正在阅读PEP 0008(样式指南),我注意到它建议使用self作为实例方法中的第一个参数,但cls是类方法中的第一个参数.

我已经使用并编写了几个类,但我从未遇到过类方法(嗯,一个将cls作为参数传递的方法).有人能告诉我一些例子吗?

谢谢!

小智 98

实例方法

创建实例方法时,第一个参数始终是self.您可以将其命名为任何名称,但其含义将始终相同,您应该使用self它,因为它是命名约定. self(通常)在调用实例方法时隐藏传递; 它表示调用方法的实例.

这是一个名为的类的示例,Inst它具有一个名为的实例方法introduce():

class Inst:

    def __init__(self, name):
        self.name = name

    def introduce(self):
        print("Hello, I am %s, and my name is " %(self, self.name))
Run Code Online (Sandbox Code Playgroud)

现在调用这个方法,我们首先需要创建一个类的实例.一旦我们有了一个实例,我们就可以调用introduce()它,实例将自动传递为self:

myinst = Inst("Test Instance")
otherinst = Inst("An other instance")
myinst.introduce()
# outputs: Hello, I am <Inst object at x>, and my name is Test Instance
otherinst.introduce()
# outputs: Hello, I am <Inst object at y>, and my name is An other instance
Run Code Online (Sandbox Code Playgroud)

如你所见,我们没有传递参数self,它会被句点运算符隐藏传递; 我们调用Inst类的实例方法introduce,参数为myinstotherinst.这意味着我们可以调用Inst.introduce(myinst)并获得完全相同的结果.


类方法

类方法的想法与实例方法非常相似,唯一的区别在于,我们现在将类本身作为第一个参数传递,而不是将实例隐藏地作为第一个参数传递.

class Cls:

    @classmethod
    def introduce(cls):
        print("Hello, I am %s!" %cls)
Run Code Online (Sandbox Code Playgroud)

由于我们只将一个类传递给该方法,因此不涉及任何实例.这意味着我们根本不需要实例,我们将类方法称为静态函数:

 Cls.introduce() # same as Cls.introduce(Cls)
 # outputs: Hello, I am <class 'Cls'>
Run Code Online (Sandbox Code Playgroud)

请注意,再次Cls隐藏地传递,所以我们也可以说Cls.introduce(Inst)并获得输出"Hello, I am <class 'Inst'>.当我们继承一个类时,这个特别有用Cls:

class SubCls(Cls):
    pass

SubCls.introduce()
# outputs: Hello, I am <class 'SubCls'>
Run Code Online (Sandbox Code Playgroud)

  • 在你的第一个例子中,你不是说 xp() 而不是 print(x) 吗? (2认同)