一、面向对象介绍
- 面向过程的编程思想
核心过程二字,过程指的是解决问题的步骤,即先干什么\再干什么\后干什么
基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式
优点:复杂的问题流程化\进而简单化
缺点:可扩展性差
- 面向对象的编程思想
核心是对象二字,对象是特征与技能的结合体
基于该思想编写程序(脑子始终想的是对象二字)就好比在创造一个世界,世界是由
一个个对象组成,在上帝眼里任何存在的事物都是对象,任何不存在的事物也都可以造
出来,是一种上帝式的思维方式
优点: 可扩展性强
缺点: 编程的复杂度要高与面向过程
- 类:
对象是特征与技能的结合体,而类则是一系列对象相同的特征与技能的结合体
强调:
1.对象是具体存在的事物,而类则一个抽象的概念
2.站在不同的角度总结出的类与对象是不同的
在现实世界中:先有一个个具体存在的对象,然后随着人类文明的发展才总结出类的概念
在程序中: 先定义类,后调用类来产生对象
重点:面向对象的核心体现是将数据和处理数据的程序封装到对象中
二、类的使用
语法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 类的声明: 2 ''' 3 class 类名: # class定义类语法的关键字 4 pass 5 ''' 6 7 # 对象的产生: 对象的实例化 8 ''' 9 对象1 = 类名() 10 对象2 = 类名() 11 对象3 = 类名() 12 ''' 13 14 # 类与对象都有自己独立的名称空间,每一个被实例化出来的对象,名称空间也是各自独立 15 # 所以类与对象都能额外添加 属性(变量) 和 方法(函数) 16 17 # 重点:类一旦被加载(随着所属文件的加载就加载),就会进入类的内部执行类中的所有代码
1.先定义类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class OldboyStudent: 2 #相同的特征 3 school = 'oldboy' 4 5 #相同的技能 6 def choose_course(self): 7 print('choosing course')
类是一系列对象相同的特征(变量)与技能(函数)的结合体,即类体中最常见的就是变量与函数的定义
但是其实类体中是可以存在任意python代码
类体代码会在类定义阶段立即执行,会产生一个类名称空间,用来将类体代码执行过程中产生的名字都丢进去,查看方式如下
1 # print(OldboyStudent.__dict__) # 查看类的名称空间 2 # print(OldboyStudent.school) #print(OldboyStudent.__dict__['school']) 3 # print(OldboyStudent.choose_course) 4 # OldboyStudent.school='OLDBOY' #OldboyStudent.__dict__['school']='OLDBOY' 5 # OldboyStudent.country='China' #OldboyStudent.__dict__['country']='China' 6 # del OldboyStudent.country # del OldboyStudent.__dict__['country'] 7 # print(OldboyStudent.__dict__)
总结:
#1. 类本质就是一个名称空间,或者说是一个用来存放变量与函数的容器
#2. 类的用途之一就是当做名称空间从其内部取出名字来使用
#3. 类的用途之二是调用类来产生对象
2.后调用类来产生对象
# 调用类的过程称之为类的实例化,调用类的返回值称之为类的一个对象/实例
1 class OldboyStudent: 2 #相同的特征 3 school = 'oldboy' 4 5 #相同的技能 6 def choose_course(self): 7 print('choosing course')
#调用类发生了什么?
1.调用类会产生一个类的对象返回
1 stu1=OldboyStudent() 2 stu2=OldboyStudent() 3 stu3=OldboyStudent() 4 5 # print(stu1.__dict__) 6 # print(stu2.__dict__) 7 # print(stu3.__dict__)
2.触发类中函数__init__的执行,将对象连同调用类括号内指定的参数一同传入__init__
1 class OldboyStudent: 2 #相同的特征 3 school = 'oldboy' 4 5 # stu1,'李铁蛋',18,'male' 6 def __init__(obj, name, age, sex): 7 obj.name = name #stu1.name='李铁蛋' 8 obj.age = age #stu1.age=18 9 obj.sex = sex #stu1.sex='male' 10 11 #相同的技能 12 def choose_course(self): 13 print('choosing course') 14 stu1=OldboyStudent('李铁蛋',18,'male') #__init__(stu1,'李铁蛋',18,'male') 15 stu2=OldboyStudent('赵钢弹',38,'female') #__init__(stu2,'赵钢弹',38,'female') 16 stu3=OldboyStudent('刘银弹',28,'male') #__init__(stu3,'刘银弹',28,'male')
# 总结__init__的功能: 是在实例化时就为对象初始自己独有的特征
# 注意:不能有返回值
三.对象属性的查找顺序
1 class People: 2 # 类自带(不同在外界额外添加)的属性与方法 3 identify = '人类' 4 def sleep(self): 5 print('睡觉') 6 7 8 p1 = People() 9 p2 = People() 10 11 p1.identify = '新人类' 12 print(p1.identify) # 访问自己的 13 p1.__dict__.clear() # 删除自己的后 14 print(p1.identify) # 访问类的 15 16 print(p2.identify) # p2没有自己的,访问类的 17 18 # 重点:属性的访问顺序:优先加载自身的名字,如果没有再考虑类的