面向对象的编程思想
核心是对象二字,对象是特征与技能的结合体
基于该思想编写程序(脑子里始终想的是对象二字),就好比在创造一个世界,世界有一个个对象组成,
在上帝眼里任何不存在的事物都可以创造,是一中上帝式的思维方式
优点:可拓展性强
缺点:编程的复杂度要高于面向过程
类:
对象是特征与技能的结合体,而类则是一些列对象相同的特征与技能的结合体
强调:1.对象是具体存在的事物,而类是一个抽象的概念
2.站在不同的角度总结出类与对象是的不同
现实世界中:现有一个个具体存在的对象,然后对着人类文明的发展才总结出的类的概念
在程序中:先定义类,后调用类来产生对象
站在老男孩选课的角度
总结出现实世界中的对象
学生对象1:
特征:
学校 = ‘ oldboy’
name = ‘egon’
age = ‘79’
sex = ‘female’
技能:
选课
学生对象2:
特征:
学校 = ‘ oldboy’
name = ‘bgon’
age = ‘45’
sex = ‘female’
技能:
选课
学生对象3:
特征:
学校 = ‘ oldboy’
name = ‘cgon’
age = ‘60’
sex = ‘male’
技能:
选课
在程序中
1.先定义类
class OldboyStudent:
# 相同的特征
school = 'oldboy'
# 相同的技能
def choose_course(self):
print('choose course')
print('=====>>>>')
类是一些列对象相同的特征(变量)与技能(函数)的结合体,即类体重最常见的就是变量与函数的定义,
但其实类体中是可以存在任意python代码的
类体代码会在类体定义阶段立即执行,会产生一个名称空间,用来将类体代码的名字丢进去,产看方式如下
print(OldboyStudent.school) # print(OldboyStudent.__dict__['school'])
print(OldboyStudent.choose_course)
print(OldboyStudent.__dict__) # 查看类的名称空间
.(点后面的都是属性)
修改数据
OldboyStudent.school = 'OLDBOY'
print(OldboyStudent.__dict__)
增加数据
OldboyStudent.county = 'China'
print(OldboyStudent.county)
删除数据
del OldboyStudent.county
print(OldboyStudent.__dict__)
OldboyStudent.choose_course(123) # 运行报错
print(OldboyStudent.choose_course)
总结:
1.类就是一个名称空间,或者说是一个用来寻访变量和函数的容器
2.类的用途之一就是当做名称空间从其内部取出名字来使用
3.类的用途之二是调用类来产生对象
2.后调用来产生对象
调用类的过程称之为类的实例化,调用类的返回值称之为类的一个对象/实例
调用类发生了??
1.会产生一个对象,然后返回
stu1 = OldboyStudent()
stu2 = OldboyStudent()
stu3 = OldboyStudent()
#
print(stu1.__dict__)
print(stu2.__dict__)
print(stu3.__dict__)
不同的属性
学生1的不同特征
name = ‘egon’
age = ‘79’
sex = ‘female’
stu1.name = 'egon'
stu1.age = 79
stu1.sex = 'female'
print(stu1.__dict__)
学生2的不同特征
name = ‘bgon’
age = ‘45’
sex = ‘female’
stu2.name = 'bgon'
stu2.age = 45
stu2.sex = 'female'
print(stu2.__dict__)
学生3的不同特征
name = ‘cgon’
age = ‘60’
sex = ‘male’
stu3.name = 'cgon'
stu3.age = 60
stu3.sex = 'male'
print(stu3.__dict__)
但是这样会有代码冗余问题
为对象定制自己独有的特征
class OldboyStudent:
# 相同的特征
school = 'oldboy'
# 相同的技能
def choose_course(self):
print('choose course')
stu1 = OldboyStudent()
stu2 = OldboyStudent()
stu3 = OldboyStudent()
def init(obj,name,age,sex):
obj.name = name
obj.age = age
obj.sex = sex
#
init(stu1.'egon',79,'female')
init(stu2.'bgon',45,'female')
init(stu3.'cgon',60,'male')
print(stu1.__dict__)
print(stu2.__dict__)
print(stu3.__dict__ )
简化方式2
class OldboyStudent:
# 相同的特征
school = 'oldboy'
def __init__(obj,name,age,sex):
obj.name = name
obj.age = age
obj.sex = sex
# 相同的技能
def choose_course(self):
print('choose course')
# 调用类发生了
# 1.产生了一个空对象,然后返回
# 2.会触发类中__init__函数的执行
stu1 = OldboyStudent('egon',79,'female')
stu2 = OldboyStudent('bgon',45,'female')
stu3 = OldboyStudent('cgon',60,'male')
# print(stu1.__dict__)
# print(stu2.__dict__)
# print(stu3.__dict__)
# 总结__init__函数的功能
# 1.实在实例化时就为对象初始自己独有的特征
# 注意点:__init__函数不能有返回值
stu1.xxx = 111
print(stu1.__dict__)
class OldboyStudent:
school = 'oldboy'
def __init__(obj,name,age,sex):
obj.name = name
obj.age = age
obj.sex = sex
def choose_course(self):
print('choose course')
stu1 = OldboyStudent('egon',79,'female')
先从对象自己的名称空间中,没有则去所属的类中查找
类中定义的变量是所有对象共享的,类也可以来使用