面向对象
面向对象的过程
面向过程中核心是过程二字,过程就是先干什么、在干什么、最后干什么,就是机械式的思维方式
优点:复杂的问题简单化、进而流程化
缺点:扩展性差,牵一发而动全身
应用场景: 一般用在对扩展性要求比较差的情况
面向对象的编程
面向对象它也是一种编程的思想,不是一门新的技术栈
面向对象中对象是核心,必须搞明白什么是对象
"""在Python中一切皆对象!"""
对象是什么?
在生活中:
对象就是'特征'与'技能'的集合体
在程序中:
对象就是盛放'数据属性'和'功能'的容器
优点:扩展性强
缺点:简单的问题复杂化了
类的点定义的对象产生
对象:是特征与技能的结合体
"""站在不同的角度,分出来的类不一样"""
类:一系列相似的特征和相似的技能的结合体
问题来了?
到底是先有对象还是先有类?
1. 生活中
先有人,在有人类,那就是先有对象,在有类
2. 程序中:
"""一定是先有类,然后调用类,产生对象!!!!!!!"""
产生对象的类与对象之间存在关联,这种关联指的是
对象可以访问到类中共有的数据与功能,所以类中的内容仍然是属于对象的,类只不过是一种节省空间、减少代码冗余的机制,面向对象编程最终的核心仍然是去使用对象。
1. 关键字使用class来声明
2. class后面写的是类名,类名的命名:一般情况下遵循变量的命名规范即可,类名一般首字母都要大写,(小写也行,但是不推荐)
3. 如果你的类名比较长,推荐使用驼峰法,并且是大驼峰
4. 类名后面的小括号不能省略
定义类发生了哪些事情?
1. 类一旦定义完成,会立马执行类体代码
2. 会产生类的名称空间,其实就是一个大字典,然后把类中得名字都丢到类的名称空间去
3. 把类的名称空间绑定给 类名.__dict__中
### 只是定义类
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)
# 如何查看类的名称空间?
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']))
"""在调用类的时候,会自定调用类里面的__init__方法"""
"""调用类的时候有特殊的功能,它会把对象自己当成第一个参数传给__init__方法"""
# stu = Student('kevin', 19, 'male') # stu = Student(stu, 'kevin', 19, 'male')
# # stu1 = Student()
#
# stu1 = Student('jerry', 20, 'female')
类的查找(类的属性和对象属性)
有类属性、对象自己的属性
1. 类属性的查找 查 print(Student.school)
增加 Student.z = 666
改 Student.school = 'BJ'
删除 del Student.schoo
查
print(stu.name)
print(stu.age)
print(stu.school) #### 如果你使用的是点语法,那么,对象查找属性的时候,先从对象自己的名称空间中查找,如果找不到,就去产生这个对象的类中查找
增加
stu.x = 666
改
stu.x = 888
删除
del stu.x