类和实例方法之间的区别

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

我已经使用和写了几个类,但我从来没有遇到类方法(那么,一个方法,通过CLS作为参数)。 有人能给我看一些例子吗?

谢谢!

实例方法

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

现在调用这个方法,我们首先需要创build我们的类的一个实例。 一旦我们有一个实例,我们可以调用它的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 ,它使用了周期运算符隐藏地传递; 我们调用Inst类的实例方法introduce ,使用myinstotherinst的参数。 这意味着我们可以调用Inst.introduce(myinst)并获得完全相同的结果。


类方法

类方法的思想与实例方法非常相似,区别在于不是将实例隐藏作为第一个parameter passing,而是将类本身作为第一个parameter passing。

 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.introduce(Inst) "Hello, I am <class 'Inst'> 。当从Clsinheritance一个类的时候,

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