面向对象基础
-
什么是面向对象?
指的是一门编程思想
面向过程编程:
核心是‘过程’二字,过程指的是做事情的步骤,即先做什么再做什么
基于该编程思想编写程序,就好比一条工厂流水线,一种机械式的思维方式。
优点:
逻辑清晰,复杂的问题流程化,进而简单化。
缺点:
可扩展性差。
面向对象编程:
核心是‘对象’二字,对象指的是特征与技能的结合体。
基于该编程思想编程,就好比创造世界,一种上帝式的思维方式。
优点:
可扩展性高。
缺点:
编写程序的复杂程度要远高于面向过程编程
优先使用面向过程还是面向对象?
面向过程结合面向对象一起使用。
选课系统项目
类
如何造对象?首先学习类
什么是类?
类型、类别、分类
先定义类、后调用类产生对象
-在现实世界中:
对象是一个个具体存在的事物,类是由人类文明的发展抽象总结出来的。
-在程序中:
必须遵循,先有类,再有对象
如何定义类:
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中一切皆对象