8.2 成员函数

定义在类内部的函数,就是成员函数,还可以叫做方法。
属性用来描述对象,而方法则是对象的动作、行为或者功能等。方法的调用,必须要有对象。
class Student:
    name=""
    id=""
    clazz=""
    def printName(self):
        print("名字是:"+self.name)
s=Student()
s.name="乔峰"
s.printName() #必须要有对象才能调用printName
关于成员函数,有以下几点需要注意:
1.成员函数定义在类内部
2.成员函数的第一个参数必定是self,但是调用的时候忽略这个参数,此参数代表当前对象
3.成员函数内部可以通过self访问所有的属性和方法
类Student有三个属性,有一个函数printName,它还有一个参数self,这个参数在定义的时候必须有,但是调用的时候是要忽略的,不需要给出。这个self代表当前的对象,它可以取得当前对象的属性,例如第6行代码self.name

4.成员函数的调用必须有对象
s.printName的意义就是s的printName这个功能被调用,就好像电视遥控器的换台功能。我们不可能脱离电视机提高音量,在此,也不能脱离Student对象调用printName。
和普通函数不同的是,成员函数的调用必须有对象。
调用printName()的时候虽然是没有参数的,但是调用它需要对象,需要使用对象的name属性,哪个对象调用方法,self就是哪个对象,就使用哪个对象的name属性。如果没有对象是无法调用此函数的,将出现语法错误:
class Student:
    name=""
    id=""
    clazz=""
    def printName(self):
        print("名字是:"+self.name)
stu=Student()
stu.name='John'
printName() #这行代码将出错,printName前必须有对象
类的行为是这个事物的功能或动作。类的行为就是方法,printName这个方法,就属于Student类的一个功能。
成员函数可以通过self这个预定义的隐藏变量使用所有属性。
通过对象调用方法,就是这个对象的行为和功能,而方法的调用,必定需要一个对象,否则这是谁的功能?谁的行为?方法内部使用的又是谁的属性? stu.printName()这样的写法,意思就是使用stu的printName功能,必须要有对象 。
这和之前函数的调用有所不同,因为之前的函数调用全部都是静态的,并不需要对象。

self也可以用调用其他的成员函数,例如下面的代码第9行代码self.getId():
class Student:
    name=""
    id=""
    clazz=""
    def getId(self):
       return self.id
    def printName(self):
        print("id是"+self.getId()) #调用self(当前对象)的getId方法
        print("名字是:"+self.name)
stu=Student()
stu.id='2023432143214'
stu.name='John'
stu.printName() #printName的self指的就是stu
stu2=Student()
stu2.id='20224584598455'
stu2.name='Peter'
stu2.printName() #printName的self就是stu2

再来看一个例子,这是一个玩具车类:
class ToyCar:
    name=''
    kilo=''
    length=''
    color=''
    style=''
    def start(self):
        print(self.name+"开车!")
    
    def stop(self):
        print(self.name+"停车!")
    
    def turnLeft(self):
        print(self.name+"左转!")
    
    def turnRight(self):
        print(self.name+"右转!")
    
    def backup(self):
        print(self.name+"倒车!")
    
    def accelerate(self):
        print(self.name+"加速!")
    
car = ToyCar()
car.name="风起长林"
car.start()
car.accelerate()
car.turnLeft()
car.stop()
这些成员函数,就好像是遥控器上的功能按钮,按下哪个就执行对应的功能。