类和实例方法之间的区别

时间:2013-06-16 15:07:40

标签: python

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

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

谢谢!

2 个答案:

答案 0 :(得分:94)

实例方法

创建实例方法时,第一个参数始终为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))

现在要调用此方法,我们首先需要创建一个类的实例。 获得实例后,我们可以在其上调用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

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


类方法

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

class Cls:

    @classmethod
    def introduce(cls):
        print("Hello, I am %s!" %cls)

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

 Cls.introduce() # same as Cls.introduce(Cls)
 # outputs: Hello, I am <class 'Cls'>

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

class SubCls(Cls):
    pass

SubCls.introduce()
# outputs: Hello, I am <class 'SubCls'>

答案 1 :(得分:0)

简单地说,实例方法就是在类中定义的函数。它随着类的不同实例而变化。 示例:

class Dog:
    def __init__(self, sound):
        self.sound = sound
    def bark(self):
        return f"The dog makes the sound: {self.sound}"

而类方法是一种与 bark() 方法不同的方法,它应用于类的所有实例。