面向对象基础
什么是面向对象?
指的是一门编程思想
面向过程编程:
核心是‘过程’二字,过程指的是做事情的步骤,即先做什么再做什么
基于该编程思想编写程序,就好比一条工厂流水线,一种机械式的思维方式。
优点:
逻辑清晰,复杂的问题流程化,进而简单化。
缺点:
可扩展性差。
面向对象编程:
核心是‘对象’二字,对象指的是特征与技能的结合体。
基于该编程思想编程,就好比创造世界,一种上帝式的思维方式。
优点:
可扩展性高。
缺点:
编写程序的复杂程度要远高于面向过程编程
优先使用面向过程还是面向对象?
面向过程结合面向对象一起使用。
选课系统项目
类
如何造对象?首先学习类
什么是类?
类型、类别、分类
先定义类、后调用类产生对象
-在现实世界中:
对象是一个个具体存在的事物,类是由人类文明的发展抽象总结出来的。
-在程序中:
必须遵循,先有类,再有对象
如何定义类:
1.先从现实世界中,基于一个个的对象,抽取出来
2.再定义类。
##### 类:对象是特征与技能的结合体,类是一系列对象相同的特征与技能的结合体
先定义类、后调用类产生对象
学生对象1: 特征: school name ege sex 技能: learn choice
定义类的语法:
def 函数名() class 类名: 对象相同的特征 对象相同的技能 class: 用来定义类的,class后跟的是类名。 类名:类的名字,用来调用创造对象的。 注意:类名必须要遵循驼峰命名法, python在定义变量与函数时不推荐使用,但在定义类时推荐使用。 在定义类发生得到事情: 1.类在定义时,会产生一个类的名称空间。 2.会把类内部所有名字,扔进类的名称空间中 注意:类在定义阶段就已经产生好了名称空间,执行python文件时会执行类的内体代码
学生类: 相同特征-->类内部的变量 school 相同技能-->类内部的函数 learn choose_course
class OldboyStudent: school = 'oldboy' def learn(self): # self对象自己 print('learn python') def choose_course(self): print('choose course') OldboyStudent -->会指向类的名称空间 print(OldboyStudent) 地址 print(OldboyStudent.__dict__) 查看类的名称空间中所有名字(以key:value形式存在字典中) print(OldboyStudent.__dict__.get('school')) # oldboy
查 print(OldboyStudent.__dict__.get('school')) #改 #OldboyStudent.__dict__['school']='oldgirl' #print(OldboyStudent.__dict__.get('school')) #报错 只能读,不能增删改
类.特征或技能的方式对类内部的名字进行修改 '.'会指向类内部的名称空间,从而获取名字 # 查 print(OldboyStudent.school) # oldboy # 改 OldboyStudent.school ='oldgirl' print(OldboyStudent.school) # 增 OldboyStudent.address = '上海' print(OldboyStudent.address) # 特征也称之为属性 # 删除 del OldboyStudent.address
OldeboyStudent.choose_course(123)# 调用技能
以上是类的所有操作
如何产生对象: 语法: 类名 + ()调用类产生对象 名称空间的产生: 1.类的名称空间在类定义阶段就已经产生了。 2.对象的名称空间,在调用类时产生。 OldboyStudent()#得到一个学生对象地址 stu1 = OldboyStudent()#赋值给变量,实体 stu2 = OldboyStudent() stu3 = OldboyStudent()
# .指向对象名称空间 print(stu1.school) stu1.learn() print(stu2.school) stu2.learn() print(stu3.school) stu3.learn() 问题:对象与对象之间的特征与技能一样。 解决:在类内部定义__init__函数 __init__:会在调用类时,自动触发该函数# 为对象初始化某些属性 def __init__(self):#self 对象本身 调用类发生的事情: 1.首先会产生一个空的对象, 就是产生'对象的名称空间' 2.会自动触发__init__. 3.会把对象本身以及括号内的参数一并传给__init__函数。#stu3 = OldboyStudent() 若__init__中有self以外的参数,调用类时必须在括号内传入参数 def __init__(self,x,y,z) stu1 = OldboyStudent('zzx',23,'male')
#给对象添加属性一 stu1.name = 'zzx' print(stu1.name) #给对象添加属性二 def __init__(self,x,y,z) self.name = x self.age = y self.sex = z stu1 = OldboyStudent('zzx',23,'male') print(stu1.name)
对象与类的查找顺序
对象查找特征优先自己的,然后找类的,没有则报错。
对象绑定方法的特殊之处
类内部的函数主要是给对象用的
- 由类来调用类内部的函数,该函数只是一个普通的函数,普通函数需要接收几个参数就得传入几个参数。
- 由对象来调用的函数称之为对象的绑定方法,不同的对象调用该绑定方法,则会将不同的对象传入该绑定方法中。
print(OldboyStudent.learn) # function OldboyStudent.learn(123) stu1 = OldboyStudent('zzx',23,'male')# 实例一个对象 stu1.learn()# 不用参数,stu1当作第一个参数传给了self
#对象之间与类的方法功能是一样的 OldboyStudent.learn(123) stu1.learn() # 内存地址不一样 print(OldboyStudent.learn) print(stu1.learn)# 绑定了
Python中一切皆对象