0.对比
互补:
面向过程的缺点就是面向对象的优点.
面向对象的缺点就是面向过程的优点.
1.面向过程的概念
核心:过程.
过程:解决问题的流程.
优点:复杂的问题流程化进而简单化.
一个复杂的问题,拆分成一个个的流程,分步完成.
缺点:牵一发动全身,扩展性差,可维护性差.
应用场景:对扩展性要求不高的地方.
逻辑不变的,固定死的代码.
"""
注册用户的功能
1.获取用户输入 用户名 和 密码
2.验证参数
3.写入文件,注册成功
"""
def register():
"""
:return: 字典 {
'username': username,
'password': password}
"""
username = input('输入用户名称>>>:').strip()
password = input('输入用户密码>>>:').strip()
return {
'username': username,
'password': password
}
def check_info(userinfo):
"""
:param userinfo: 字典 {需要有名称和密码}
:return: is_valid 验证信息
"""
is_valid = True
if len(userinfo['username']) == 0:
print('用户名称为空')
is_valid = False
if len(userinfo['username']) == 0:
print('用户密码为空')
is_valid = False
return is_valid
def writer_file(userinfo, is_valid):
"""
:param userinfo: 字典 {需要有名称和密码}
:param is_valid: 验证后的信息
:return: Tuer 或 False True注册成功 False 注册失败
"""
if is_valid:
import json
with open('%s.txt' % userinfo['username'], mode='w', encoding='utf8') as f1:
json.dump(userinfo, f1)
return True
else:
return False
def main():
userinfo = register()
is_valid = check_info(userinfo)
is_success = writer_file(userinfo, is_valid)
if is_success:
print('注册成功!')
else:
print('输入不合法!')
if __name__ == '__main__':
main()
2.面向对象的概念
核心:对象
对象对象的三大特征:
封装,继承,多态
程序中:
函数是存放功能的容器,
对象是存放功能与数据的容器.
小说中: 陈北玄和李七夜
主角的特征(先装嫩后装逼): 变量 --> 属性
主角的神通(扮猪吃老虎): 函数 --> 方法
优点:扩展性高,可维护性搞.
缺点:代码复杂度高
应用场景:对扩展性要求高的地方.
3.推导1
程序是由数据和功能组成,本质就是定义一系列的数据
然后再定义一系列的功能来对数据进行操作.
学生选课系统 Version 1.0
数据与功能是分离的
如果用户的数据多了维护麻烦
stu1_name = 'kid'
stu1_age = 18
stu1_gender = 'male'
stu1_school = 'xxx'
stu1_courses = []
stu2_name = 'qq'
stu2_age = 18
stu2_gender = 'female'
stu2_school = 'xxx'
stu2_courses = []
def elective(stu_name, stu_courses, course):
stu_courses.append(course)
print('%s成功选择%s课程!' % (stu_name, course))
elective(stu1_name, stu1_courses, 'Python')
elective(stu2_name, stu2_courses, 'linux')
4.推导2
学生选课系统 Version 2
每个同学的信息,散乱,查找/修改不方便,
使用字典类型存储,将学生信息封装成到字典容器中,方便区分学生的信息.
stu1 = {
'name': 'kid',
'age': 18,
'gender': 'male',
'school' = 'xxx'
'courses': []
}
stu2 = {
'name': 'qq',
'age': 18,
'gender': 'male',
'school' = 'xxx'
'courses': []
}
def elective(stu_name, stu_courses, course):
stu_courses.append(course)
print('%s成功选择%s课程!' % (stu_name, course))
elective(stu1['name'], stu1['courses'], 'Python')
elective(stu2['name'], stu2['courses'], 'linux')
5.推导3
学生选课系统 Version 3
函数名可以作为容器类型的元素.
对象的雏形:字典中同时具有学生数据和选课功能.
def elective(stu, course):
stu['courses'].append(course)
print('%s成功选择%s课程!' % (stu['name'], course))
stu1 = {
'name': 'kid',
'age': 18,
'gender': 'male',
'courses': [],
'school' = 'xxx'
'elective': elective
}
stu2 = {
'name': 'qq',
'age': 18,
'gender': 'male',
'courses': [],
'school' = 'xxx'
'elective': elective
}
stu1['elective'](stu1, 'Python')
stu2['elective'](stu2, 'Linux')
6.推导4
学生选课系统 Version 4
多个学生注册,字典中会产生一些重复且不变的数据.
将这部分的数据提取出来.定义成一个函数,存放在这个可以共用的容器中.
减少代码的冗余.
def elective(stu, course):
stu['courses'].append(course)
print('%s成功选择%s课程!' % (stu['name'], course))
Student = {
'school': 'xxx',
'elective': elective
}
stu1 = {
'name': 'kid',
'age': 18,
'gender': 'male',
'courses': [],
}
stu2 = {
'name': 'kid',
'age': 18,
'gender': 'male',
'courses': [],
}
Student['elective'](stu1, 'Python')
Student['elective'](stu2, 'Linux')
Python语言提供了类来更好将数据和功能存放.
7.类的定义
类的作用:解决对象中数据的冗余。
7.1简介
对象:特征和技能的结合体
类:一系列相似的对象可以分为同一个类.
(同一个类中的事物都具备了相同的特征和技能)
站在不同的分类,划分的分类不一样.\:
我的盆友 xxx
xxx 与 石头 都是 东西类
xxx 与 猴子 都是 动物类
xxx 与 在座各位 都是人类 (你们都是大帅币)
7.2定义类
Python提供关键字 class 创建类.
语法格式:
class 类名(继承):
""" 类的说明 """
类体代码
类名一般首字母大写,
# 注意事项:
1. 类名可以遵循变量名的命名规范
驼峰体:
大驼峰: UserName (类名推荐使用)
小驼峰: userName
# 2. 下划线 (类名尽量不使用使用)
类名后面的括号如果不写参数(继承)可以省略不写.
学生选课系统 Version 4 中
多个学生注册,字典中会产生一些重复且不变的数据.
数据-->学校 功能-->选课
将对象中重复的数据提取出来.存放在一个共用的容器中.
那么这个容器可以是类.这个过程称为封装.
类就是为存放相同的特征和技能而存在.
定义类将相同的数据放入类中
在类中定义的变量称为 属性
在类中定义的函数称为 方法
class Student():
school = 'xxx'
def elective(stu, course):
stu['courses'].append(course)
print('%s成功选择%s课程!' % (stu['name'], course))
7.3实例化造对象
类名加括号称为实例化.
实例化之后得到一个对象,为一个空字典{}. (默认为空)
(可以使用字典的方法.)
stu1 = Student()
print(stu1)
print(stu1.__dict__, type(stu1.__dict__))
7.4定义阶段
定义类发生的事:
1.立刻执行类体代码
2.产生一个类的名称空间,把类体内产生的名称都归档进名称空间.(字典)
3.把类的名称绑定给.__dict__ (类名.__dict__可以进行查看)
class Kind:
num = 1
print(num)
print(Kind.__dict__)
"""
{'__module__': '__main__', 'num': 1, <---< 看这里啊 <----<----<--
'__dict__': <attribute '__dict__' of 'Kind' objects>,
'__weakref__': <attribute '__weakref__' of 'Kind' objects>,
'__doc__': None}"""
8.对象独有属性
每次实例化之后的对象,都拥有自己独立的名称空间.
可以使用对象.__dict__查看对象中所有的值.
对象是一个字典,可以使用字典的方法.
一般情况下推荐使用对象的提供的.方式,不使用__dict__.
8.1增
实例化的对象是一个字典,使用字典添加值的方式,创建对象独有的属性.
对象.__dict__[key] = value
类提供.的方式创建值.
对象.key = value
class Student:
school = 'xxx'
def elective(stu, course):
stu['courses'].append(course)
print('%s成功选择%s课程!' % (stu['name'], course))
stu1 = Student()
stu1.__dict__['name'] = 'kid'
stu1.__dict__['age'] = 18
stu1.__dict__['gender'] = 'male'
print(stu1.__dict__)
stu2 = Student()
stu2.name = 'qz'
stu2.age = 18
stu2.gender = 'male'
print(stu2.__dict__)
8.2查
对象.__dict__[key]
对象.key
stu1 = Student()
stu1.__dict__['name'] = 'kid'
stu1.__dict__['age'] = 18
stu1.__dict__['gender'] = 'male'
print(stu1.__dict__)
print(stu1.__dict__['name'])
print(stu1.__dict__['age'])
print(stu1.__dict__['gender'])
stu2 = Student()
stu2.name = 'qz'
stu2.age = 18
stu2.gender = 'male'
print(stu2.__dict__)
print(stu2.name)
print(stu2.age)
print(stu2.gender)
8.3改
对象.__dict__[key] = value (新值)
对象.key = value (新值)
stu1 = Student()
stu1.__dict__['name'] = 'kid'
stu1.__dict__['name'] = 'qzq'
stu1.age = 18
stu1.age = 19
print(stu1.__dict__['name'])
print(stu1.age)
8.4删
stu1 = Student()
stu1.__dict__['name'] = 'kid'
del stu1.__dict__['name']
print(stu1.__dict__)
stu1.__dict__['age'] = 18
del stu1.__dict__['age']
print(stu1.__dict__)
9.推导5
学生选课系统 Version 5
1.先调用类产生一个对象(空字典{}),
2.在通过.的方式添加学生的数据到字典中.
3.对象调用方法,会将自己(对象自己)作为第一个参数进行传参,所以可以省略不写.
*** stu1.elective('Python') ==> stu1.elective(stu1, 'Python') ***
class Student:
school = 'xxx'
def elective(stu, courses):
stu.courses.append(courses)
print('%s成功选择%s课程!' % (stu.name, courses))
stu1 = Student()
stu1.name = 'kid'
stu1.age = 18
stu1.gender = 'male'
stu1.courses = []
stu1.elective('Python')
stu2 = Student()
stu2.name = 'qz'
stu2.age = 19
stu2.gender = 'male'
stu2.courses = []
stu2.elective('Linux')
10.推导5升级
学生选课系统 Version 5升级
定义方法时约定俗成使用self作为形参接收对象.
class Student():
school = 'xxx'
def elective(self, courses):
self.courses.append(courses)
print('%s成功选择%s课程!' % (self.name, courses))
stu1 = Student()
stu1.name = 'kid'
stu1.age = 18
stu1.gender = 'male'
stu1.courses = []
stu1.elective('Python')
stu2 = Student()
stu2.name = 'qq'
stu2.age = 19
stu2.gender = 'male'
stu2.courses = []
stu2.elective('Linux')
11.推导6
学生选课系统 Version 6升级
为对象增加值的过程重复,写进函数.
在创建对象独有属性时调用.
class Student:
school = 'xxx'
def elective(self, courses):
self.courses.append(courses)
print('%s成功选择%s课程!' % (self.name, courses))
def init(self, name, age, gender, courses):
self.name = name
self.age = age
self.gender = gender
self.courses = courses
stu1 = Student()
stu2 = Student()
init(stu1, 'kid', 18, 'male', [])
stu1.elective('Python')
init(stu2, 'qz', 19, 'male', [])
stu2.elective('Linux')
12.推导7
函数部分是共用的,将共同分放进类中.
class Student:
school = 'xxx'
def init(self, name, age, gender, courses):
self.name = name
self.age = age
self.gender = gender
self.courses = courses
def elective(self, courses):
self.courses.append(courses)
print('%s成功选择%s课程!' % (self.name, courses))
stu1 = Student()
stu2 = Student()
Student.init(stu1, 'kid', 18, 'male', [])
Student.init(stu2, 'kid', 18, 'male', [])
stu1.elective('Python')
stu2.elective('Linux')
13.推导7升级
类提供__init__方法,在实例时会自动执行__init__方法,
__init__方法会接收实例化时括号中传递的参数.类提供__init__方法,在实例时会自动执行__init__方法,
__init__方法会接收实例化时括号中传递的参数.
__init__方法称为初始化方法,它不能有返回值,如果非要返回,返回None.
class Student:
school = 'xxx'
def __init__(self, name, age, gender, courses):
self.name = name
self.age = age
self.gender = gender
self.courses = courses
def elective(self, courses):
self.courses.append(courses)
print('%s成功选择%s课程!' % (self.name, courses))
stu1 = Student('kid', 18, 'male', [])
stu1.elective('Python')
stu2 = Student('qz', 19, 'male', [])
stu2.elective('Linux')
最终的这个推导而来的就是面向对象编程,
对象编程:提前先定义类,在创造对象.
14.注意点
提示:实例属性应该在init中定义
在其他的方法对值进行修改的操作
而不是新增加,如果没初始化不要有值就写None.