面向对象程序设计(Object Oriented Programming,OOP)的思想主要针对大型软件设计而提出,它使得软件设计更加灵活,能够很好地支持代码复用和设计复用,并且使得代码具有更好的可读性和可扩展性。Python完全采用了面向对象程序设计的思想,是真正面向对象的高级动态编程语言,完全支持面向对象的基本功能。因此,掌握面向对象程序设计思想至关重要。
在面向对象编程中,最重要的两个概念就是类和对象(也称为实例)。
对象是某个具体存在的事物,例如,一个名叫“Jack”的学生就是一个对象。 与对象相比,类是抽象的,它是对一群具有相同特征和行为的事物的统称。例如,学校的学生,其特征包括“学号”“姓名”“性别”等,其行为包括“选课”“上课”“考试”等。
类即类别/种类,是面向对象分析和设计的基石,如果多个对象有相似的数据与功能,那么该多个对象就属于同一种类。
有了类的好处是:我们可以把同一类对象相同的数据与功能存放到类里,而无需每个对象都重复存一份,这样每个对象里只需存自己独有的数据即可,极大地节省了空间。所以,如果说对象是用来存放数据与功能的容器,那么类则是用来存放多个对象相同的数据与功能的容器
面向对象程序设计思想是把事物的特征和行为包含在类中。其中,事物的特征作为类中的变量,事物的行为作为类的方法,而对象是类的一个实例。定义类的基本语法格式如下:
class 类名: 类体
注意:
(1)类名的首字母一般需要大写,如Car。
(2)类体一般包括变量的定义和方法的定义。
(3)类体相对于class关键字必须保持一定的空格缩进。
#定义类 class Car: price = 150000 #定义价格变量 def run(self): #定义行驶方法 print('车在行驶中……')
在Python中,创建对象的语法格式如下:
对象名 = 类名()
创建完对象后,可以使用它来访问类中的变量和方法,具体方法是:
对象名.类中的变量名 对象名.方法名([参数])
例:为前面定义的Car类创建一个car_1对象,并访问类中的变量和方法。
class Car: price = 150000 #定义价格变量 def run(self): #定义行驶方法 print('车在行驶中……') car_1 = Car() #创建一个对象,并用变量car_1保存它的引用 car_1.run() #调用run()方法 print('车的价格是:',car_1.price) #访问类中的变量
程序运行效果
类的所有方法都必须至少有一个名为self的参数,并且必须是方法的第1个参数。
在Python中,由同一个类可以生成无数个对象,当一个对象的方法被调用时,对象会将自身的引用作为第一个参数传递给该方法,那么Python就知道需要操作哪个对象的方法了。
注意:
在类的方法中访问变量时,需要以self为前缀,但在外部通过对象名调用对象方法时不需要传递该参数。
例:self的使用。
class Car: def colour(self,col): #定义赋值颜色方法 self.col=col #赋值 def show(self): #定义显示颜色方法 print('The color of the car is %s.'%self.col) #输出颜色 car_1 = Car() #创建对象car_1 car_1.colour('red') #调用方法 car_2 = Car() #创建对象car_2 car_2.colour('white') #调用方法 car_1.show() #调用方法 car_2.show() #调用方法
程序运行结果:
构造方法的固定名称为__ init __ (),当创建类的对象时,系统会自动调用构造方法,从而实现对对象进行初始化的操作。
例:使用构造方法。
#定义类 class Car: #构造方法 def __init__(self): self.wheelNum = 4 self.colour = '蓝色' #方法 def run(self): print('{}个轮子的{}车在行驶中……'.format(self.wheelNum, self.colour)) BMW = Car() #创建对象 BMW.run() #调用方法
程序运行结果:
例:使用带参构造方法。
#定义类 class Car: #构造方法 def __init__(self,wheelNum,colour): self.wheelNum = wheelNum self.colour = colour #方法 def run(self): print('{}个轮子的{}车在行驶中……'.format(self.wheelNum, self.colour)) BMW = Car(4,'红色') #创建对象 Audi = Car(4,'白色') #创建对象 BMW.run() #调用方法 Audi.run() #调用方法
程序运行结果:
例:用面向对象程序设计思路编写程序,模拟学生选课,每选一门课程,将课程名加入到学生的所选课程中,同时将课程的学分累加到学生的总学分中。
#定义学生类 class Stu: #构造方法定义学生属性 def __init__(self,num,name,credit,course): self.num = num self.name = name self.credit = credit self.course = course #定义学生选课方法 def choose(self,c): self.credit+=c.credit self.course.append(c.name) #定义课程类 class Cou: #构造方法定义课程属性 def __init__(self,num,name,credit): self.num = num self.name = name self.credit = credit stu_1 = Stu('201801','Jack',0,[]) #创建学生1 stu_2 = Stu('201802','Tom',3,['Math']) #创建学生2 cou_1 = Cou('01','Python',3) #创建课程1 cou_2 = Cou('02','C',4) #创建课程2 stu_1.choose(cou_1) #调用方法实现学生1选课程1 stu_2.choose(cou_2) #调用方法实现学生2选课程2 #输出各学生信息 print('学号:',stu_1.num,'姓名:',stu_1.name,'总学分:',stu_1.credit,'所选课程',stu_1.course) print('学号:',stu_2.num,'姓名:',stu_2.name,'总学分:',stu_2.credit,'所选课程',stu_2.course)
程序运行结果:
class Student(): # 定义属性 school = 'SH' # country = 'Chinese' # 当调用类的时候,会自动调用的函数, 初始化方法 (********) def __init__(stu_obj, name, age, gender, courese=None): # stu_obj => stu1 if courese is None: courese = [] stu_obj.name = name # stu1.__dict__['name'] = 'egon' stu_obj.age = age, # stu1.__dict__['age'] = 18 stu_obj.gender = gender # stu1.__dict__['gender'] = 'male' stu_obj.courese = courese # stu1.__dict__['gender'] = 'male' def choose_course(stu_obj, course): # stu_obj => stu # stu_dic['courses'].append(course) stu_obj.courese.append(course) """ stu_obj = {'name': 'egon', 'age': (18,), 'gender': 'male', 'courese': []} """ print("%s选课成功 %s" % (stu_obj.name, stu_obj.courese)) stu = Student('egon', 18, 'male') stu1 = Student('egon1', 18, 'male') # print(stu.__dict__) # 类属性的查找 # print(Student.__dict__['school']) # 查 # print(Student.school) # 增加 # Student.country = 'Chinese' # 修改 # Student.school = 'BJ' # 删除 # del Student.school # Student.choose_course(stu, 'python') # Student.choose_course(stu1, 'linux') # print(Student.choose_course) # print(Student.__dict__) # 对象的属性查找 # print(stu.__dict__) # print(stu.name) # print(stu.age) # print(stu.gender) # # stu.name = 'xxx' # print(stu.name) # print(stu.__dict__) # stu.school = 'xxxxxxx' # print(stu.__dict__) # print(stu.school) # 类中的方法类可以调用,但是推荐对象来调用,对象来调用,把对象本身当成第一个参数传递给函数的第一个参数 stu.choose_course('python') # stu.choose_course(stu, 'python') stu1.choose_course('linux') # stu.choose_course(stu, 'python')