MON.面向对象
面向过程编程
- 面向过程不是一门技术,是一种编程思想
- 优点
- 复杂的问题简单化,流程化
- 缺点
- 扩展性差
面向对象编程
-
一种编程思想
-
核心是"对象"二字
-
对象即是"容器",用来盛放数据与功能的
-
对象的终极奥义,就是将数据和功能高度"整合" ("整合"程度越高,程序的解耦合程度就越高)
-
容器 ≈ 程序 = 数据 + 功能
-
优点
- 扩展性强
-
缺点
- 编程复杂度高
1. .py 文件
# 数据
a = 1
b = 0
# 功能
def sum(x, y):
return x + y
2. 字典、列表、元组、集合
# 功能
def sum(x, y):
return x + y
# 容器,对象
sum_obj = {'x': 1,
'y': 2,
'sum': sum}
# Python 这门语言到底提供了什么语言来允许我们将数据与功能很好地整合到一起
3.Python 中的对象机制
类 -- 对对象进行分类,用以存放同类对象共有的数据与功能
面向对象编程的核心仍然是去使用对象
面向对象的底层原理
def choose_course(stu_dic,course):
stu_dic['courses'].append(course)
print("%s 选课成功 %s" % (stu_dic['name'], stu_dic['courses']))
stu1 = {
'name':'egon',
'age' : 18,
'gender' : 'male',
'courses': [],
'choose_course':choose_course
}
stu2 = {
'name':'tom',
'age' : 18,
'gender' : 'male',
'courses': [],
'choose_course':choose_course
}
stu1['choose_course'](stu2, 'python开发')
stu2['choose_course'](stu2, 'linux开发')
"""
谁来调用就将自己当做第一个参数传入即面向对象的底层原理
"""
类
-
类是对象相似数据与功能的集合体
-
类体中最常见的是变量与函数的定义,但是类体其实是可以包含任意其他代码的
-
注意: 类体代码在类定义阶段就会立即执行,会产生类的名称空间
-
类中存放的是对象共有的数据或功能的空间,本质上是为对象服务,但是类也可以自己调用
定义类
class Student:
# 定义变量
stu_school = 'oldboy'
# 定义功能
def tell_stu_info(stu_obj):
print('学生信息: 名字: %s, 年龄: %s, 性别: %s' % (
stu_obj['stu_name'],
stu_obj['stu_age'],
stu_obj['stu_gender']))
def tell_stu_info(stu_obj):
stu_obj['stu_name']=x
stu_obj['stu_age']=y
stu_obj['stu_gender']=z
print('======>')
属性访问的语法
1. print(Student.__dict__)
2.
# 访问数据属性
print(Student.stu_school)
# 访问函数属性
print(Student.set_info)
调用类,产生对象
- 类的调用不会执行类体代码,仅产生对象并建立关联
# 为对象定制自己独有的属性
1. 方法一
stu_obj.__dict__['stu_name']='jason'
stu_obj.__dict__['stu_age']=18
stu_obj.__dict__['stu_gender']='male'
print(stu_obj.__dict__)
"""
__dict__ 只在对象内部查找,不会向类查找,若所要取的值不在对象内部,则直接报错
"""
2. 方法二
Student.stu_name='egon'
Student.stu_age=18
Student.stu_gender='male'
print(stu_obj.__dict__)
"""
但上述方法有两个问题需要解决
1. 代码冗余,重复过多
2. 属性查找优先级
"""
3. 方法三
def init(stu_obj, name, age, gender):
stu_obj.name = name
stu_obj.age = age
stu_obj.gender = male
stu_obj.courses = courses
# 优化 --> 初始化方法 16:00
def __init__(self, name, age, gender):
self.name=name
self.age=age
self.gender
self.courses=courses
产生对象发生了几件事
- 产生以个空对象
- 把该空对象当做第一个参数传递
定制对象的独有属性
class Student():
school = 'SH'
# 初始化方法
def __init__(stu_obj, name, age, gender, courses=[]):
stu_obj.name = name # stu1.__dict__['name'] = 'egon'
stu_obj.age = age # stu1.__dict__['age'] = 20
stu_obj.gender = gender # stu1.__dict__['gender'] = 'male'
stu_obj.courses = courses # stu1.__dict__['courses'] = []
def choose_course(stu_dic, course):
stu_dic['courses'].append(course)
print("%s 选课成功 %s" % (stu_dic['name'], stu_dic['courses']))
# print(123)
# 类的名称空间
# print(Student.__dict__)
stu1 = Student('egon', 18 ,'male')
print(stu1.__dict__)
# stu2 = Student()
# stu1.name = 'egon' # stu1.__dict__['name'] = 'egon'
# stu1.age = 18 # stu1.__dict__['age'] = 20
# stu1.gender = 'male' # stu1.__dict__['gender'] = 'male'
# stu1.courses = [] # stu1.__dict__['courses'] = []
#
#
# stu2.name = 'tom' # stu2.__dict__['name'] = 'egon'
# stu2.age = 18 # stu2.__dict__['age'] = 20
# stu2.gender = 'male' # stu2.__dict__['gender'] = 'male'
# stu2.courses = [] # stu2.__dict__['courses'] = []
#
# init(stu1, 'egon', 18, 'male')
# init(stu2, 'tom', 18, 'male')
#
#
# print(stu1.__dict__)
# print(stu2.__dict__)
类的属性查找
'''类的属性的增加和更改'''
# 存在即查找或修改,不存在则添加
1.__dict__方法
Student.__dict__['xxx']='xxx'
2.'.'语法取值(推荐)
Student.xxx='xxx'
'''类的属性的查找'''
1.__dict__方法
print(Student.__dict__['xxx'])
2.'.'语法取值
print(Student.xxx)
'''类的属性的删除'''
1.__dict__方法
del Student.__dict__['xxx']
2.'.'语法
del Student.xxx
-
对象操作属性, '.'语法取值,先从对象中取,如果没有,再从类中取值
-
类中的属性是共享给所有对象的,类中的方法是给对象用的,并且把对象自己当成第一个参数传递。但是对象的属性是独有的,对对象属性的更改只作用给当前对象
-
调用类的过程就是实例化,得到的对象就是一个实例