本文主要介绍方法(实例方法、类方法、静态方法)、继承(单继承和多继承)以及重写等内容。
1、实例方法
用户自定义的方法。
class Student: #类属性 stu_number=True stu_name="张三" stu_age=True def __init__(self): #实例属性 self.stu_sex=True self.stu_name=True def study(self): print("好好学习,天天向上") def eat(self): print("学习饿了,要吃饭") my_student = Student() #方法调用 #1、对象名.方法名 my_student.study() #2、类名.方法名 #因为有个参数self,而self代表对象,因此传入一个对象my_student Student.study(my_student)
2、类方法
类方法需要使用@classmethod去声明,它是一个装饰器,同时在方法中的参数为cls
@classmethod def sleep(cls): print("每个人都需要睡觉")
class Student: #类属性 stu_number=True stu_name="张三" stu_age=True def __init__(self): #实例属性 self.stu_sex=True self.stu_name=True def study(self): print("好好学习,天天向上") def eat(self): print("学习饿了,要吃饭") @classmethod def sleep(cls): print("每个人都需要睡觉") my_student = Student() #方法调用 #1、对象名.方法名 my_student.study() #2、类名.方法名 #因为有个参数self,而self代表对象,因此传入一个对象my_student Student.study(my_student) #通过对象名.方法名 my_student.sleep() #通过类名.方法名 Student.sleep()
通过上面的调用,对比实例方法和类方法,在调用的时候有一点点的区别,在使用类名.方法名调用的时候,类方法可以不用传递参数,而实例方法需要传递参数。
3、静态方法
与类方法一样,静态方法在定义时也需要声明:@staticmethod,与类方法和实例方法不同的是,静态方法没有self或者cls
class Student: #类属性 stu_number=True stu_name="张三" stu_age=True def __init__(self): #实例属性 self.stu_sex=True self.stu_name=True def study(self): print("好好学习,天天向上") def eat(self): print("学习饿了,要吃饭") #类方法 @classmethod def sleep(cls): print("每个人都需要睡觉") #静态方法 @staticmethod def stop(): print("123") my_student = Student() #方法调用 #1、对象名.方法名 my_student.study() #2、类名.方法名 #因为有个参数self,而self代表对象,因此传入一个对象my_student Student.study(my_student) #通过对象名.方法名 my_student.sleep() #通过类名.方法名 Student.sleep() #通过对象名.方法名 my_student.stop() #通过类名.方法名 Student.stop()
一个类可以通过继承另一个类的非私有的成员属性和方法。例如B继承A,那么A就叫父类或者基类,B就叫子类。在python中,一个子类可以继承多个父类。
class MianBaoCar: def __init__(self): self.color = "white" self.wheel = 4 def drive(self): print("我是普通面包车,我可以开100km/h") class FlsyCar(MianBaoCar): def __init__(self): print("我是跑车:2222") def my_color(self): print("我是蓝色")
从上面的红框中,可以看出继承了MianBaoCar中的属性wheel和color以及方法drive
多继承
class Car: def __init__(self): self.color = "white" self.wheel = 4 print("我是普通车型:1111") def drive(self): print("我是普通车,我可以开120km/h") class MianBaoCar: def __init__(self): self.color = "black" self.wheel = 5 self.fangxiangpan=1 print("我是面包车,2222") def drive(self): print("我是普通面包车,我可以开100km/h") class FlsyCar(Car,MianBaoCar): # def __init__(self): # # super().__init__() # print("我是跑车:3333") def my_color(self): print("我是蓝色") def drive(self): super().drive() print("我是跑车,我要开180km/h") # 对象初始化 my_flsycar =FlsyCar() # my_flsycar.drive() # my_flsycar.drive() print(my_flsycar.fangxiangpan)
FlsyCar继承了(Car和MianBaoCar),但输出my_flsycar.fangxiangpan这里报错了,原因是多继承时,继承的构造函数是第一个父类Car而不是MianBaoCar。而第一个父类Car中并没有fangxiangpan这个属性。
在子类中重新实现父类的方法就叫做重写。
class MianBaoCar: def __init__(self): self.color = "white" self.wheel = 4 def drive(self): print("我是普通面包车,我可以开100km/h") class FlsyCar(MianBaoCar): def __init__(self): # super().__init__() print("我是跑车:2222") def my_color(self): print("我是蓝色") def drive(self): print("我是跑车,我要开180km/h") # 对象初始化 my_flsycar =FlsyCar() # my_flsycar.drive() my_flsycar.drive()
子类中继承父类的drive()方法,打印的结果是:我是普通面包车,我可以开100km/h。子类中重写了父类的drive()方法后,打印的结果是:我是跑车,我要开180km/h。
那么,如果子类需要保留父类中drive()方法,使得打印结果是:我是普通面包车,我可以开100km/h。我是跑车,我要开180km/h。应该怎么做呢?
super():代表父类
class MianBaoCar: def __init__(self): self.color = "white" self.wheel = 4 def drive(self): print("我是普通面包车,我可以开100km/h") class FlsyCar(MianBaoCar): def __init__(self): # super().__init__() print("我是跑车:2222") def my_color(self): print("我是蓝色") def drive(self): super().drive() print("我是跑车,我要开180km/h") # my_flsycar =FlsyCar() my_flsycar.drive()