面向对象编程
一、面向对象编程
面向对象是一门编程思想,核心是“对象”二字,对象指的是特征与技能的结合体,基于该编程思想写程序,就好比创造世界,一种“上帝式”的思维方式
优点:解决了程序的扩展性
缺点:编写程序的复杂度高,可控性差
面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。
二、类与对象
1、什么是类
类指的是类型,类别,是具有相同的特征和技能的一类事物就是类,对象指的是特征与技能的结合体,在现实世界中,先有一个个的对象,总结出类。在程序中,必须先有类,再通过调用类,产生对象。对象是实际存在的,类是抽象产生的
2、如何定义类
比如: 选课系统: - 选课系统学生类: - 学生对象1: 特征: - 姓名: 张三 - 性别: 男 - 年龄: 23 - 学校: oldboy - 技能: - 技术: python - 学习: learn - 选课: course - 学生对象2: 特征: - 姓名: 李四 - 性别: 男 - 年龄: 27 - 学校: oldboy - 技能: - 技术: python - 学习: learn - 选课: course
先从现实世界中通过一个个对象总结出类,然后再定义类,后调用类产生对象。
定义类语法: class 关键字: 帮你产生类的。 class 类的名字: - 对象之间相同的特征 - 学校 school = 'oldboy' - 对象之间相同的技能 - python def python(): pass - learn def learn(): pass - course def course(): pass
3、类的使用
''' class 类名: 特征 技能 定义类名的规范: - 驼峰命名法 '''
1 def foo(): # 函数名指向的是函数的内存地址 2 pass 3 4 5 print(foo) # <function foo at 0x000001CDFF119048> 6 7 8 # 定义老男孩学生类 9 class OldboyStudent: # 类名指向的是类的内存地址 10 # 学生相同的特征 11 # 在类中的特征 也称之为 “属性” attribute 12 school = 'oldboy' 13 14 # 学生相同的技能 15 # 注意: 在类内部定义函数,会默认有一个参数self 16 def learn(self): # self此时当做一个形参 17 print('learning....') 18 19 20 print(OldboyStudent) # <class '__main__.OldboyStudent'> 21 22 # 查看类的名称空间 23 print(OldboyStudent.__dict__) 24 print(OldboyStudent.__dict__['school']) 25 print(OldboyStudent.__dict__['learn']) 26 OldboyStudent.__dict__['learn'](123) 27 28 29 # 类提供一种特殊获取名字的方式 “类名.名字” 的方式 30 # 查 31 print(OldboyStudent.school) 32 OldboyStudent.learn('tank') 33 34 # 改 35 OldboyStudent.school = 'OldGirl' 36 print(OldboyStudent.school) 37 38 # 删 39 del OldboyStudent.school 40 41 # 增 42 OldboyStudent.school = 'Oldboy' 43 print(OldboyStudent.school) 44 OldboyStudent.old_student = 'HuChenYang' 45 print(OldboyStudent.old_student)
''' - 函数的名称空间: 在调用函数时产生,函数调用结束后销毁。 - 类的名称空间: 在定义阶段时产生,会将类中所有的名字,扔进类的名称空间中。 '''
4、对象
''' 对象的产生: - 调用类产生对象 类名 + () 调用类产生对象 类的名称空间在定义时产生,对象的名称空间在调用类时产生。 调用类产生对象的过程称之为类的实例化,对象称之为类的一个实例。 '''
1 class Student: 2 # 学校 3 school = 'oldboy' 4 5 # 学习技能 ----> method ---》 方法 6 def learn(self): 7 print(self) # 8 print('learning...') 9 10 stu1 = Student() 11 stu2 = Student() 12 stu3 = Student() 13 print(Student) # 14 print(Student.school, 'Student...') 15 print(Student.learn, 'Student...') 16 Student.learn(123) 17 print('=' * 100) 18 19 print(stu1) # <__main__.Student object at 0x0000017BFF8A5898> 20 print(stu1.school, 'stu1...') 21 print(stu1.learn, 'stu1...') 22 print(stu1) 23 # 对象调用方法时: 会将对象当做第一个参数传入方法中。 24 stu1.learn() # 25 26 print('=' * 100) 27 print(stu2) # <__main__.Student object at 0x0000017BFF8A5898> 28 print(stu2.school, 'stu2...') 29 print(stu2.learn, 'stu2...') 30 stu2.learn() 31 32 print('=' * 100) 33 print(stu3) # <__main__.Student object at 0x0000017BFF8A5898> 34 print(stu3.school, 'stu3...') 35 print(stu3.learn, 'stu3...') 36 stu3.learn()
''' 由对象来调用类内部的函数,称之为对象的绑定方法。 对象的绑定方法特殊之处: 会将对象当做第一个参数传给该方法。 '''
1 class Student(): 2 # 学校 3 school = 'oldboy' 4 5 # 给对象添加新的属性 6 def __init__(self, name, age, sex): 7 print(self.__dict__) 8 9 self.name = name 10 self.age = age 11 self.sex = sex 12 13 # 查看当前类的名称空间 14 print(self.__dict__) 15 16 # 公共方法 17 def learn(self): 18 print(self) 19 print('learning...') 20 21 22 # 查看类的名称空间 23 print(Student.__dict__) 24 25 # stu1 = Student() # Student(stu1) ---> __init__(self) ----> self == stu1 26 # stu2 = Student() # Student(stu2) ---> __init__(self) ----> self == stu2 27 # stu3 = Student() # Student(stu3) ---> __init__(self) ----> self == stu3 28 # 29 # stu1.name = '张三' 30 # stu1.age = 25 31 # stu1.sex = '男' 32 # print(stu1.name, stu1.age, stu1.sex) 33 34 stu1 = Student('李四', 27, '女') 35 print(stu1) 36 print(stu1.name, stu1.age, stu1.sex)
想要在调用类时,为对象传入对象独有的特征,需要用到绑定方法__init__
# __init__(self, name, sex, age): # name---> 张三 , sex---> 女, age----> 27 # 调用类时: 会将对象当做第一个参数,与括号内所有的参数一并传给__init__() # stu1 = Student('李四', 27, '女')
在python中,一切皆对象,包括我们之前所学的数据类型例如
num = 10 ----> num = int(10),int就是一个类
list1 = [1, 2, 3] ----> list1 = list([1, 2, 3]),list也是一个类
对象名字的查找顺序:
- 对象.属性,会先找对象自己的
- 若对象没有,会去找类的
- 若类没有,就会报错
调用类产生对象发生的事情:
1.会产生一个空对象的名称空间
2.会自动触发__init__,并且会将对象当做第一个参数传入。
3.会将调用类括号内的参数一并传给__init__()
对象绑定方法的特殊之处:
1.会将对象当做第一个参数传入。
2.若对象的绑定方法中还有其他参数,会一并传入。