今日内容概要
-
面向过程编程
-
面向对象编程
-
类的定义和对象的产生
-
定制对象自己独有的属性
-
属性的查找顺序(类属性、对象属性)
-
课堂练习题
今日内容详细(超级重要)
面向过程编程
首先,在编程中,面向过程和面向对象是编程的两大编程思想,分别是:面向过程和面向对象,二不是一门新的技术栈. # 之前我们写的ATM项目都是面向过程的 """什么是面向过程:""" 面向过程中核心是过程二字,过程就是先干什么、在干什么、最后干什么,就是机械式的思维方式 案例: # 把大象放冰箱需要几步? 1. 打开冰箱门 2. 把大象放进冰箱 3. 关上冰箱门 生活中很多很多的例子都是面向过程的 优点:复杂的问题简单化、进而流程化 缺点:扩展性差,牵一发而动全身 应用场景: 一般用在对扩展性要求比较差的情况 使用面向过程写一个注册的案例来体会面向过程的优缺点、 1. 先让用户输入用户名和密码 2. 验证参数 3. 直接把数据写入文件中
面向对象编程
面向对象它也是一种编程的思想,不是一门新的技术栈 面向对象中对象是核心,必须搞明白什么是对象 """在Python中一切皆对象!""" 对象是什么? 在生活中: 对象就是'特征'与'技能'的集合体 在程序中: 对象就是盛放'数据属性'和'功能'的容器 优点:扩展性强 缺点:简单的问题复杂化了 举例:学生选课系统 系列中有哪些角色: 学生 老师 管理员 选课功能 ...
类的定义和对象的产生
对象:是特征与技能的结合体 """站在不同的角度,分出来的类不一样""" 类:一系列相似的特征和相似的技能的结合体 问题来了? 到底是先有对象还是先有类? 1. 生活中 先有人,在有人类,那就是先有对象,在有类 2. 程序中: """一定是先有类,然后调用类,产生对象!!!!!!!""" """ 专业语法: 类的定义 def index():pass class Student(): pass """ ## 函数中得括号一定不能省略 # def index(): # pass # class Stundent(): # pass # class Student(): # pass """ 1. 关键字使用class来声明 2. class后面写的是类名,类名的命名:一般情况下遵循变量的命名规范即可,类名一般首字母都要大写,(小写也行,但是不推荐) 3. 如果你的类名比较长,推荐使用驼峰法,并且是大驼峰 4. 类名后面的小括号不能省略 """ # def index(): # print(123) ### 只是定义类 class Student(): school = 'SH' # 类属性,其实就是变量吗? def choose_course(stu_dict, course): stu_dict['courses'].append(course) print("%s选课成功:%s" % (stu_dict['name'], stu_dict['courses'])) print(123) """ 定义类发生了哪些事情? 1. 类一旦定义完成,会立马执行类体代码 2. 会产生类的名称空间,其实就是一个大字典,然后把类中得名字都丢到类的名称空间去 3. 把类的名称空间绑定给 类名.__dict__中 """ # 如何查看类的名称空间? print(Student.__dict__) # 如何产生对象? # 调用类产生对象 stu = Student() print(stu) # 如何查看对象的名称空间 print(stu.__dict__) # {} 默认情况下调用类会得到一个空对象,其实就是一个空字典 """调用类的过程也是实例化的过程,得到的对象也称为是一个实例"""
定制对象自己独有的属性
默认情况下,调用类产生一个对象,它是一个空对象,没有任何的数据 因此,我们需要给每一个对象添加数据 ### 版本3: class Student(): school = 'SH' # 类属性,其实就是变量吗? """它有特殊的含义, 在类里面必须叫__init__,然后调用类的时候才会自动触发执行""" ## 类里面一定要有这个方法吗? 不一定,也就是说,你如果需要提前定制对象的属性,你就写这个方法, 如果不需要,就不用写 def __init__(self, name, age, gender, course=None): if course is None: course = [] self.name = name # stu.__dict__['name'] = 'kevin' self.age = age # stu.__dict__['age'] = 18 self.gender = gender # stu.__dict__['gender'] = 'male' self.courses = course # stu.__dict__['courses'] = [] ## 函数写在类里面就称为是方法 def choose_course(stu_dict, course): stu_dict['courses'].append(course) print("%s选课成功:%s" % (stu_dict['name'], stu_dict['courses'])) ### 版本2 """在调用类的时候,会自定调用类里面的__init__方法""" """调用类的时候有特殊的功能,它会把对象自己当成第一个参数传给__init__方法""" # stu = Student('kevin', 19, 'male') # stu = Student(stu, 'kevin', 19, 'male') # # stu1 = Student() # # stu1 = Student('jerry', 20, 'female')
属性的查找顺序
有类属性、对象自己的属性 1. 显示类属性的查找 class Student(): school = 'SH' stu = Student() ### 1. 类属性的查找 # 查 # print(Student.__dict__['school']) print(Student.school) # 增加 Student.x = 'xxx' Student.z = 666 print(Student.__dict__) # 改 Student.school = 'BJ' print(Student.__dict__) # 删除 del Student.school print(Student.__dict__) 2. 对象自己的属性查找 ###### 对象的增删改查 stu = Student('kevin', 19, 'male') # 1. 查 print(stu.name) print(stu.age) print(stu.gender) # print(stu.x) print(stu.school) # SH #### 如果你使用的是点语法,那么,对象查找属性的时候,先从对象自己的名称空间中查找,如果找不到,就去产生这个对象的类中查找 """如果你使用的__dict__取值,只能够取到对象自己名称空间中得属性,不会去类中查找""" # print(stu.__dict__['school']) # SH #### 如果你使用的是点语法,那么,对象查找属性的时候,先从对象自己的名称空间中查找,如果找不到,就去产生这个对象的类中查找 print(stu.__dict__) ## 增加 stu.x = 666 # stu1.x = 999 ## 改 stu.x = 888 ## 删除 # del stu.x del stu.school print(stu.__dict__)
课堂练习
定义一个类,产生一堆对象,然后定义一个计数器,记录产生了多少个对象 class Student(): school = 'SH' count=0 def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender self.count+=1 # self是对象自己 #这里应用用类属性 Student.count += 1 stu = Student('kevin', 19, 'male') stu1 = Student('kevin1', 19, 'male') stu2 = Student('kevin2', 19, 'male') stu3 = Student('kevin3', 19, 'male') stu4 = Student('kevin4', 19, 'male') print(Student.count) print(stu.count)