一 面向对象介绍
1.什么是面向对象
面向对象是一门编程思想!
面向对象之前我们先来说下面向过程。
面向过程编程思想:
核心是“过程”二字,过程指的是解决问题的步骤,即先干什么再干什么! 基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。 优点: 将复杂的问题流程化,进而简单化 缺点: 牵一发而动全身,程序的可扩展性差。
注意:编程思想仅仅是一门思想,与任何的技术无关。
面向对象编程思想:
注意:要将自己当做一个上帝!无所不能! 核心是“对象二字,对象指的是“特征与技能”的结合体。 基于该编程思想编写程序,就好比在创造世界,一种“上帝式”的思维方式。 优点: 可扩展性高。 缺点: 编写程序的复杂程度比面向过程高
2.如何产生对象:
1)什么是类? 类指的是类型、类别。 在两种角度去看待: 现实世界中: 现有一个个的对象,进过社会的文明发展,随之总结出类。 对象是实际存在的,而类是抽象产生的。 在程序中: 必须先有类,再通过“调用类,产生对象”。 对象指的是“特征与技能”的结合体,类指的是一系列“对象之间相同的特征与技能”的结合体。 2)如何定义类: 如何写类并产生对象: 先从现实世界中通过一个个对象总结出类。 然后再定义类,后调用类产生对象。 比如:选课系统: 选课系统学生类: 学生对象1: 特征: 姓名:xxx1 性别:femal 年龄:95 学校:oldboy 技能: 技术:python 学习:learn 选课:course 学生对象2: 特征: 姓名:xxx2 性别:femal 年龄:73 学校:oldboy 技能: 技术:python 学习:learn 选课:course 3)定义语法类: class 关键字:帮你产生类的。 class 类的名字: 对象之间相同的特征 学校 school = 'oldboy' 对象之间相同的技能 python def python(): pass learn def learn(): pass course def course(): pass
3.类
class 类名: 特征 技能 定义类名的规范: 驼峰命名法
def foo(): # 函数名指向的是函数的内存地址 pass print(foo) # <function foo at 0x000001CDFF119048>
# 定义清华大学学生类 class QinghuaStudent: # 类名指向的是类的内存地址 # 学生相同的特征 # 在类中的特征 也称之为“属性”attribute school = 'qinghua' # 学生相同的技能 # 注意:在类内部定义函数,会默认有一个参数self def learn(self): # self此时当做一个形参 print('learning...') print(QinghuaStudent) # <class '__main__.OldboyStudent'>
# 查看类的名称空间 print(QinghuaStudent.__dict__) print(QinghuaStudent.__dict__['school']) print(OldboyStudent.__dict__['learn']) OldboyStudent.__dict__['learn'](123)
# 类提供一种特殊获取名字的方式“类名.名字”的方式 # 查 print(QinghuaStudent.school) QinghuaStudent.learn('tank') # 改 QinghuaStudent.school = 'Beida' print(QinghuaStudent.school) # 删 del QinghuaStudent.school # 增 QinghuaStudent.school = 'Qinghua' print(QinghuaStudent.school) QinghuaStudent.old_student = 'HXC' print(QinghuaStudent.old_student) ''' 函数的名称空间: 在调用函数时产生,函数调用结束后销毁。 类的名称空间: 在定义阶段时产生,会将类中所有的名字,扔进类的名称空间中。 '''
4.对象
对象的产生:
调用类产生对象
类名 + () 调用类产生对象
类的名称空间在定义时产生,对象的名称空间在调用类时产生。 调用类产生对象的过程称之为类的实例化,对象称之为类的一个实例。
class Student: # 学校 school = 'qinghua' # 学习技能 ----> method ----> 方法 def learn(self): print(self) print('learning') stu1 = Student() stu2 = Student() stu3 = Student() print(Student) print(Student.school, 'Student...') print(Student.learn, 'Student...') Student.learn(123) print('=' * 100) print(stu1) # <__main__.Student object at 0x0000017BFF8A5898> print(stu1.school, 'stu1...') print(stu1.learn, 'stu1...') print(stu1) # 对象调用方法时:会将对象当做第一个参数传入方法中。 stu1.learn() print('=' * 100) print(stu2) # <__main__.Student object at 0x0000017BFF8A5898> print(stu2.school, 'stu2...') print(stu2.learn, 'stu2...') stu2.learn() print('=' * 100) print(stu3) # <__main__.Student object at 0x0000017BFF8A5898> print(stu3.school, 'stu3...') print(stu3.learn, 'stu3...') stu3.learn() ''' 由对象来调用类内部的函数,称之为对象的绑定方法。 对象的绑定方法特殊之处:会将对象当做第一个参数传给该方法。 '''
class Student: # 学校 school = 'qinghua' def __init__(self, name, sex, age): # stu1, 'tank', 'male', 17 print(self.__dict__) # 给对象添加新的属性 self.name = name # stu1.x = 'tank' self.sex = sex # stu1.y = 'male' self.age = age # stu1.z = 17 # 查看当前对象的名称空间 print(self.__dict__) # 学习技能 ----> method ---》 方法 def learn(self): print(self) # print('learning...') # 查看类的名称空间 print(Student.__dict__) # stu1 = Student() # Student(stu1) ---> __init__(self) ----> self == stu1 # stu2 = Student() # Student(stu2) ---> __init__(self) ----> self == stu2 # stu3 = Student() # Student(stu3) ---> __init__(self) ----> self == stu3 # stu1.name = '江鹏' # stu1.sex = 'female' # stu1.age = 84 # print(stu1.name, stu1.sex, stu1.age) # # print(stu1) # print(stu2) # print(stu3) ''' **** 想要在调用类时,为对象传入对象独有特征 ***** __init__(self, name, sex, sge): # name --->tank , sex ---> male , age ---> 17 调用类时:会将对象当做第一个参数,与括号内所有的参数一并传给__init__() stu1 = Student('tank', 'male', 17) 注意:凡是在内部定义的,__开头或者__结尾的方法都有特殊的意义。 在类内部定义的方法,在调用类时触发,会自动将对象本身当做第一个参数自动传入,与括号内所有的参数一并传给__init__()。 __init__(self): '''
5.对象名字的查找顺序 ******
1)对象.属性,会先找对象自己的。 2)若对象没有,会去找类的。 3)若类没有,则会报错。
calss People: country = 'China' name = 'jason' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def run(self): print('running...') obj1 = People('tank', 17, 'male') print(obj1.name) # tank 找对象自己的name属性 print(obj1.country) # China 对象没有,找类中的属性 # AttributeError: 'People' object has no attribute 'jason' # print(obj1.jason) # 对象没有,类也没有,就会报错! print(obj1.__dict__) # 给对象的名称空间添加 country='中国' 属性 obj1.country = '中国' print(obj1.__dict__) print(People.__dict__) print(obj1.country)
6.一切皆对象
在python中的一切皆对象
class Foo: def __init__(self, x, y, z): self.x = x self.y = y self.z = z # 产生对象 # 调用类产生对象的过程称之为类的实例化,对象称之为类的一个实例。 foo_obj = Foo(10, 20, 30) print(foo_obj) # number = 10 # int(10) ----> __init__(number, 10) # int(10) # l1 ---> list对象 # l1 = list([1, 2, 3]) # dict() # tuple((1, 2, 3)) # float # str # set # bool # enumerate # bytes # filter