一、两大编程思想
在编程中,面向过程和面向对象是编程的两大编程思想
什么是面向过程
面向过程中核心是过程二字,过程就是先干什么、在干什么、最后干什么,就是机械式的思维方式
案例:
把大象放冰箱需要几步?
1. 打开冰箱门
2. 把大象放进冰箱
3. 关上冰箱门
生活中很多很多的例子都是面向过程的
优点:复杂的问题简单化、进而流程化
缺点:扩展性差,牵一发而动全身
应用场景: 一般用在对扩展性要求比较差的情况
什么是面向对象
面向对象也是一种编程的思想,不是一门新的技术栈
”面向对象“的核心是“对象”二字 ,而对象的精髓在于“整合“,什么意思?
所有的程序都是由”数据”与“功能“组成,因而编写程序的本质就是定义出一系列的数据,然后定义出一系列的功能来对数据进行操作。对象就是盛放'数据属性'和'功能'的容器,或者说”对象“就是一个盛放数据与功能的容器/箱子/盒子。
二、 类与对象
类即类别/种类,如果多个对象有相似的数据与功能,那么该多个对象就属于同一种类。有了类的好处是:我们可以把同一类对象相同的数据与功能存放到类里,而无需每个对象都重复存一份,这样每个对象里只需存自己独有的数据即可,极大地节省了空间。所以,如果说对象是用来存放数据与功能的容器,那么类则是用来存放多个对象相同的数据与功能的容器
在程序中,必须要事先定义类,然后再调用类产生对象(调用类拿到的返回值就是对象)。产生对象的类与对象之间存在关联,这种关联指的是:对象可以访问到类中共有的数据与功能,所以类中的内容仍然是属于对象的,类只不过是一种节省空间、减少代码冗余的机制,面向对象编程最终的核心仍然是去使用对象。
类的定义与实例化
class Student: # 类的命名应该使用“驼峰体”
school='清华大学' # 数据
def choose(self): # 功能
print('%s is choosing a course' %self.name)
类体最常见的是变量的定义和函数的定义,但其实类体可以包含任意Python代码,类体的代码在类定义阶段就会执行,因而会产生新的名称空间用来存放类中定义的名字,可以打印Student.__dict__来查看类这个容器内盛放的东西
print(Student.__dict__)
用类的过程称为将类实例化,拿到的返回值就是程序中的对象,或称为一个实例
stu1=Student() # 每实例化一次Student类就得到一个学生对象
三、定制对象自己独有的属性
class Student:
school='清华大学'
#该方法会在对象产生之后自动执行,专门为对象进行初始化操作,可以有任意代码,但一定不能返回非None的值
def __init__(self,name,sex,age):
self.name=name
self.sex=sex
self.age=age
def choose(self):
print('%s is choosing a course' %self.name)
#进行实例化
stu1=Student('kk','male',28)
#查看产生的对象名称空间
stu1.__dict__
{'name': 'kk', 'sex': 'male', 'age': 28}
属性查找顺序与绑定方法
对象的名称空间里只存放着对象独有的属性,而对象们相似的属性是存放于类中的。对象在访问属性时,会优先从对象本身的__dict__中查找,未找到,则去类的__dict__中查找
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'])
print(stu.__dict__)
# 增加
stu.x = 666
# stu1.x = 999
# 改
stu.x = 99
# 删除
# 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)