4

目录1 面向对象概念2 类的定义和对象的产生1类的定义2 创建类的对象3 self参数4 构造方法 __ init __ ()3 属性的操作 面向对象程序设计

面向对象程序设计(Object Oriented Programming,OOP)的思想主要针对大型软件设计而提出,它使得软件设计更加灵活,能够很好地支持代码复用和设计复用,并且使得代码具有更好的可读性和可扩展性。Python完全采用了面向对象程序设计的思想,是真正面向对象的高级动态编程语言,完全支持面向对象的基本功能。因此,掌握面向对象程序设计思想至关重要。

1.面向对象概念

在面向对象编程中,最重要的两个概念就是类和对象(也称为实例)。

对象是某个具体存在的事物,例如,一个名叫“Jack”的学生就是一个对象。

与对象相比,类是抽象的,它是对一群具有相同特征和行为的事物的统称。例如,学校的学生,其特征包括“学号”“姓名”“性别”等,其行为包括“选课”“上课”“考试”等。

img

类即类别/种类,是面向对象分析和设计的基石,如果多个对象有相似的数据与功能,那么该多个对象就属于同一种类。

有了类的好处是:我们可以把同一类对象相同的数据与功能存放到类里,而无需每个对象都重复存一份,这样每个对象里只需存自己独有的数据即可,极大地节省了空间。所以,如果说对象是用来存放数据与功能的容器,那么类则是用来存放多个对象相同的数据与功能的容器

img

2.类的定义和对象的产生

1类的定义

面向对象程序设计思想是把事物的特征和行为包含在类中。其中,事物的特征作为类中的变量,事物的行为作为类的方法,而对象是类的一个实例。

定义类发生了几件事?
1. 立即执行类体代码,
2. 产生一个类的名称空间,把类体中的属性名和函数名都扔到一个大字典中
3. 把类的名称空间绑定给__dict__ 类名.dict

定义类的基本语法格式如下:

class 类名:
    类体

注意

(1)类名的首字母一般需要大写,如Car。

(2)类体一般包括变量的定义和方法的定义。

(3)类体相对于class关键字必须保持一定的空格缩进。

#定义类
class Car:	
    price = 150000		#定义价格变量
    def run(self):		#定义行驶方法
        print('车在行驶中……')

2.创建类的对象

在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)	#访问类中的变量


程序运行效果

img

3.self参数

类的所有方法都必须至少有一个名为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()				#调用方法

程序运行结果:

img

4.构造方法 __ init __ ()

构造方法的固定名称为__ init __ (),当创建类的对象时,系统会自动调用构造方法,从而实现对对象进行初始化的操作。

例:使用构造方法。

#定义类
class Car:
#构造方法
    def __init__(self):
        self.wheelNum = 4
        self.colour = '蓝色'
#方法
    def run(self):
        print('{}个轮子的{}车在行驶中……'.format(self.wheelNum, self.colour))
BMW = Car()				#创建对象
BMW.run()				#调用方法

程序运行结果:

img

例:使用带参构造方法。

#定义类
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()				#调用方法

程序运行结果:

img

例:用面向对象程序设计思路编写程序,模拟学生选课,每选一门课程,将课程名加入到学生的所选课程中,同时将课程的学分累加到学生的总学分中。

#定义学生类
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)

程序运行结果:

img

3.属性的操作

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')