print('面向对象编程基础预习')
'''
面向过程编程:
核心是过程二字,过程指的是解决问题的步骤,即先干什么,在干什么,最后干什么...
基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式
优点:复杂的问题流程化,进而简单化,
缺点:可扩展性差
面向对象编程:
就是围绕提高程序扩展性的问题
核心是对象二字,对象指的是特征(变量)与技能(函数)的结合体
对象就是单个个体与普遍共性的统一
基于该思想编写程序,就好比是在创造一个世界,你就是世界的上帝
在上帝眼里,一切存在的事物都是对象,任何不存在的对象也都可以造出来
是一种上帝式的思维方式
优点:扩展性强
缺点:编程的复杂度高
类:如果说对象是特征与技能的而结合体,那么类就是一系列对象相似的特征与技能的结合体
PS:站在不同的角度总结出的类是不同的
在现实世界中,一定是先有对象,再有分类的概念
在程序中,请务必记住,一定要先定义类,后调用类,来产生对象
在现实世界中,站在老男孩选课系统角度
对象一:
特征:
school = 'oldboy'
name = '李泰迪'
sex = 'male'
age = 18
choosed_courses = [python,linux]
技能:
选课
对象二:
特征:
school = 'oldboy'
name = 牛榴弹'
sex = 'female'
age = 24
choosed_course = [linux]
技能:
选课
对象n....
对象3:老师
特征:
school = 'oldboy'
name = 'egon'
sex = 'male'
age = 18
level = 10
技能:
打分
点名
对象n....
现实世界中,老男孩学生类
相似的特征:
school = 'oldboy'
相似的技能:
选课
'''
###再程序中,先定义类
##在类定义阶段就会立即执行类体代码,会产生类的名称空间,用于将类体代码执行过程中产生
#的名字都存存放在类的名称空间中
# class OldboyStudent: ###定义类的名称用驼峰体,定义函数或者变量用下划线
# school = 'oldboy' ####相似的特征用变量定义
# print('======================')
# def choose_course(self):
# print('is choosing course')
##后调用类来产生对象,调用类的过程又称之为实例化
# stu1 = OldboyStudent()
##stu1可以称为一个对象,也可以称之为一个实例
'''
类与对象的使用
类的使用:
'''
'''
类有两种用途:
用途一:类本身就是一个容器(名称空间),所以可以增删改查类的属性
print(OldboyStudent.__dict__)####查看该类的名称空间并打印出来
print(OldboyStudent.school)####查看该类的属性并打印出来
print(OldboyStudent.choose_course)###查看该类的技能
print('===================================')
print(OldboyStudent.__dict__)
##修改之前查看一下该类的名称空间
print('=================================')
OldboyStudent.school = 'oldgirl'
OldboyStudent.country = 'China'
print(OldboyStudent.__dict__)
##修改之后再查看一下该类的名称空间,查看是否是一样的
用途二:调用类来产生对象,调用类的过程称之为实例化
'''
# class OldboyStudent: ###定义类的名称用驼峰体,定义函数或者变量用下划线
# school = 'oldboy' ####相似的特征用变量定义
# # print('======================')
# def choose_course(self):
# print('is choosing course')
###调用类生成对象
# stu1= OldboyStudent()
# stu2 = OldboyStudent()
# stu3 = OldboyStudent()
# ...
# print(stu1.school)
###对象独有的属性
# stu1.name = '李明'
# stu1.age = 29
# stu1.sex = 'male'
# print(stu1.__dict__)
###对象的单独属性和功能可以这样定义
###同样的,其他的对象也可以这样一行一行的增删改查相应的属性和功能
###但是如果真的这样一行一行的写,那么效率就真的太低下了,为了减少代码量
##简化这个程序,我们想到了一种初始化的方式,定义一个函数,可以避免这种繁琐的操作
# def init(obj,x,y,z):
# obj.name = x
# obj.sex = y
# obj.age = z
# init(stu2,'王大宝','male',24)
# print(stu2.__dict__)
# init(stu3,'孙小明','female',33)
# print(stu3.__dict__)
'''
对象的属性查找顺序:
首先在对象自己的名称空间中查找,然后再在类的名称空间中查找,
在类的名称空间中查找不到的时候就会报错,不会在全局变量中查找
'''
'''
初始化
初始化方法;会在类调用时,或者叫实例化时自动触发__init(stu1,x,y,z)
'''
#
# class OldboyStudent: ###定义类的名称用驼峰体,定义函数或者变量用下划线
# school = 'oldboy' ####相似的特征用变量定义
# # print('======================')
# def choose_course(self):
# print('is choosing course')
#
# def init(obj,x,y,z):
# obj.name = x
# obj.sex = y
# obj.age = z
###会在类调用时,或者叫实例化时自动触发__init(stu1,)
# stu1= OldboyStudent()
# stu2 = OldboyStudent()
# stu3 = OldboyStudent()
# init(stu1,'王二丫','female',18)
# init(stu3,'孙小明','male',24)
# init(stu3,'狗剩子','female',33)
###看这个代码,定义一次类,然后调用三次类,生成三个对象,然后定义一个初始化的函数,调用三次初始化的函数,
# 给三个对象赋予自己特殊的属性和功能,
#相对于之前一个对象一个属性一行代码的写,这样的效率确实高了一些,但是我们还是觉得这样太麻烦,
# 我们想寻求一种更加简单的方式,简化代码
##所以我们尝试用下面这种做法
class OldboyStudent: ###定义类的名称用驼峰体,定义函数或者变量用下划线
school = 'oldboy' ####相似的特征用变量定义
# print('======================')
def choose_course(self):
print('is choosing course')
def __init__(self, x, y, z): ###将这个函数放到类定义的内部去
self.name = x
self.sex = y
self.age = z
stu1 = OldboyStudent('孙小平','male',24)
print(stu1.__dict__)
print('========================================================')
'''
绑定方法:
绑定方法的特殊之处:
1,绑定给谁就应该由谁来调用
2,谁来调用,就会将谁当做第一个参数自动传入
'''
stu1 = OldboyStudent('孙小平','male',24)
stu2 = OldboyStudent('王大明','male',25)
stu3 = OldboyStudent('李小二','male',26)
stu1.school =