
3.2.4 类中的函数
类中的函数有实例函数、类函数和静态函数,实例函数的第1个形参必须是self,类函数的第1个形参必须是cls,静态函数不需要self和cls。
1.实例函数
用类创建实例后,类中的函数变成实例的方法。类中的函数和一般的函数定义方法相同,实例函数的第1个形参一定是self,也可以给其他形参设定初始值,形参也可以是数量可变的参数。函数的返回值可以没有,可以有1个或多个。第1个形参是self的函数称为实例函数或实例方法。在实例函数内部可以用“self.函数名()”的形式调用其他实例函数,在类外部,用类进行实例化后,用“实例名.函数名()”的形式调用实例函数,不需要给self传递实参,不需要在()中输入self,实参也可以是关键字参数。
2.初始化函数
初始化函数是一个特殊的实例函数。在创建类时,通常要定义一个初始化函数__init__(),在init名字的前后分别加两个单下画线,这个函数在类进行实例化时会被自动执行。通常这个函数用于类创建实例时,对实例进行初始化设置,用这个函数传递初始化数据。用类创建实例时输入的参数将传递给__init__()函数。

3.静态函数
在类中定义函数语句(def)的前面加入一行声明“@staticmethod”,随后定义的函数将成为静态函数,静态函数的形参中不需要传入self,而且在静态函数的函数体中也不能直接使用带有self前缀的数据,但可以通过“类名.类变量”的形式使用类变量。静态函数的实参中可以将带self前缀的数据传递给静态函数体。在类内部可以通过“类名.函数名()”的形式调用静态函数,在类外面可以用“类名.函数名()”或者“实例名.函数名()”的形式调用静态函数。静态函数相当于类外部的一个普通函数,只不过是把普通函数定义到类中,例如下面的静态函数。静态函数的返回值的类型任意,可以是静态函数所在类的实例对象。

4.类函数
在类中定义函数语句(def)的前面加入一行声明“@classmethod”,随后定义的函数将成为类函数。类函数的第1个形参必须是cls(class的缩写),类函数的函数体中通过“cls.变量名”的形式直接使用类变量,通过“cls.函数名()”形式直接调用其他类函数,通过“cls.函数名()”直接使用实例函数,在实例函数内通过“类名.函数名()”的形式调用类函数,在类外通过“类名.函数名()”或“实例名.函数名()”的形式调用类函数。将上面静态函数的代码修改一下得到如下类函数的例子。

5.方法的属性化
类定义中,在一个实例函数前面加入修饰符“@property”可以将实例函数变成实例属性,在调用实例函数时,不需要再加入括号,例如下面的代码中获取姓名和分数的代码。
