类和实例方法之间的区别
我正在阅读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
,使用myinst
或otherinst
的参数。 这意味着我们可以调用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'>
。当从Cls
inheritance一个类的时候,
class SubCls(Cls): pass SubCls.introduce() # outputs: Hello, I am <class 'SubCls'>