面向对象编程介绍
面向过程编程
核心是“过程”二字,过程指的是做事情的步骤,即先做什么再做什么。
基于该编程思想写程序,就好比一条工厂流水线,一种机械式的思维方式。
优点:逻辑清晰,复杂的问题流程化,进而简单化。
缺点:可扩展性差。
面向对象编程
面向对象编程的核心是对象二字,对象指得是特征与技能的结合体。基于该编程思想写程序,就好比在创造世界,一种上帝式的思维方式。
优点:可扩展性高。
缺点:编写程序的复杂程度远高于面向过程。
类和对象
什么是类?类型,分类
先定义类,后调用类产生对象。
在现实世界中:对象是一个个具体存在的事物,类是由人类文明的发展抽象总结出来的。
在程序中:必须遵循先有类,再有对象
总结:
对象是特征与技能的结合体,类是一系列对象相同的特征与技能的结合体。
定义类
# 类名使用驼峰命名法 class Student: school = 'oldboy' def choose_course(self): print('choose course') def learn(self): print('learn')
在定义类发生的事情:
- 类在定义时,会产生一个空的名称空间
- 会把类中定义的名字,扔进类的名称空间中
注意:类在定义阶段就已经产生好了名称空间,执行python文件时会执行类内部的代码
class Student: school = 'oldboy' def choose_course(self): print('choose course') def learn(self): print('learn') print(Student.__dict__) # 查看类的名称空间中所有名字 ''' {'__module__': '__main__', 'school': 'oldboy', 'choose_course': <function Student.choose_course at 0x0000010EF2FD3510>, 'learn': <function Student.learn at 0x0000010EFA1A0950>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None} '''
对象的创建和使用
类的操作
class Student: school = 'oldboy' def choose_course(self): # self就是对象本身 print('choose course') def learn(self): print('learn') print(Student.school) # 查找 Student.school = 'oldgirl' # 修改 print(Student.school) ''' oldgirl ''' Student.address = '上海' # 增加 print(Student.address) del Student.address # 删除 Student.choose_course(123) # 括号里面需要参数
名称空间的产生:
- 类的名称空间在定义阶段就已经产生了
- 对象的名称空间,在调用类时产生
class Student(): school = 'oldboy' def choose_course(self): print('choose course') def learn(self): print('learn') stu1 = Student() stu2 = Student() stu3 = Student() print(stu1.school) stu1.choose_course() stu1.learn()
在类内部定义__init__
函数
__init__
会在调用类时自动触发该函数,为对象初始化某些属性
class Student(): school = 'oldboy' def __init__(self): print('此处是__init__') def choose_course(self): print('choose course') def learn(self): print('learn') stu1 = Student() stu2 = Student() stu3 = Student() print(stu1.school) stu1.choose_course() stu1.learn()
调用类发生的事情:
- 首先会产生一个空的对象,就是产生“对象的名称空间”
- 会自动触发
__init__
- 会把对象以及括号内的参数一并传给
__init__
函数
class Student(): school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def choose_course(self): print('choose course') def learn(self): print('learn') stu1 = Student('cwz', 23, 'male') print(stu1.name) print(stu1.age) print(stu1.sex) ''' cwz 23 male '''
对象与类的查找顺序
class Student(): school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def choose_course(self): print('choose course') def learn(self): print('learn') stu1 = Student('cwz', 23, 'male') print(stu1.__dict__) print(stu1.name, stu1.school) ''' {'name': 'cwz', 'age': 23, 'sex': 'male'} cwz oldboy '''
对象与类的查找顺序:
- 对象.属性,若对象本身有,则优先查找对象自己的
- 若对象本身没有,则去类里面找,若类里面没有,则报错
对象绑定方法
class Student(): school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex print(self) def choose_course(self): print('choose course') def learn(self): print('learn') # print(Student.learn) # Student.learn(133) stu1 = Student('qwe', 20, 'male') stu1.learn()
类内部的函数主要是给对象用的:
- 由类来调用类内部的函数,该函数只是一个普通的函数,普通函数需要接收几个参数就得传入几个参数
- 由对象来调用称之为对象的绑定方法,不同的对象调用该绑定方法,则会将不同的对象传入该绑定方法中
- 对象的绑定方法,是由对象来调用的,特殊之处就是把对象当作第一个参数传入该方法中
class Student(): school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex print('stu:', self) def choose_course(self): print('choose course') def learn(self): print('learn') # print(Student.learn) # Student.learn(133) stu1 = Student('qwe', 20, 'male') stu2 = Student('cwz', 21, 'male') stu1.learn() print('stu1', stu1) stu2.learn() print('stu2', stu2) print(stu1.learn) ''' stu: <__main__.Student object at 0x0000019E249E2128> stu: <__main__.Student object at 0x0000019E249E2198> learn stu1 <__main__.Student object at 0x0000019E249E2128> learn stu2 <__main__.Student object at 0x0000019E249E2198> <bound method Student.learn of <__main__.Student object at 0x0000019E249E2128>> '''
小练习
''' 人狗互咬大战 ''' class Person: def __init__(self, name, aggr, life): self.name = name self.aggr = aggr self.life = life # 人咬狗方法 def bite(self, dog): if dog.life < 0: return True dog.life -= self.aggr print( f''' 人 {self.name}咬狗 {dog.name} 狗掉血 {self.aggr} 狗还剩的血量 {dog.life} ''' ) class Dog: def __init__(self, name, dog_type, aggr, life): self.name = name self.dog_type = dog_type self.aggr = aggr self.life = life # 狗咬人方法 def bite(self, person): if person.life < 0: return True person.life -= self.aggr print( f''' 狗 {self.name}咬人 {person.name} 人掉血 {self.aggr} 人还剩的血量 {person.life} ''' ) p1 = Person('neo', 300, 400) d1 = Dog('大黄', '土狗', 200, 500) while True: flag1 = p1.bite(d1) if flag1: break flag2 = d1.bite(p1) if flag2: break