面向过程的编程
面向过程,核心是过程二字,过程指的是解决问题的步骤,设计一条流水线,机械式的思维方式
优点:复杂的问题流程化,进而简单化。
缺点:可扩展性差
面向对象的编程
面向对象,核心是对象二字,对象就是特征与技能的结合体。
优点:可扩展性强
缺点:变成复杂性高
应用场景:用户需求经常变化,互联网应用,游戏,企业内部应用(办公系统等)
定义类与实例化出对象
类就是一系列对象相似的特征与技能的结合体。
强调:站在不同的角度,得到的分类是不一样的。
在现实世界中:一定先有对象,后由类
在程序中:一定是先定义类,后调用类产生对象
站在路飞学院角度,大家都是学生
在现实世界中: 对象1:王二丫 特征: 学校='luffycity' 名字='王二丫' 性别='女' 年龄=18 技能: 学习 吃饭 睡觉 对象2:李三炮 特征: 学校='luffycity' 名字='李三炮' 性别='男' 年龄=38 技能: 学习 吃饭 睡觉 对象3:张铁蛋 特征: 学校='luffycity' 名字='张铁蛋' 性别='男' 年龄=48 技能: 学习 吃饭 睡觉 总结现实中路飞学院的学生类 相似的特征 学校='lluffycity' 相似的技能 学习 吃饭 睡觉
# 先定义类 class LuffyStudent: school = 'luffycity' # stu1, '王二丫', '女', 18 def __init__(self, name, sex, age): self.Name = name self.Sex = sex self.Age = age #stu1.Name = '王二丫' #stu1.Sex = '女' #stu1.Age = 18 def learn(self, x): print('%s is learning %s.' % (self.Name, x)) def eat(self): print('is eating.') def sleep(self): print('is sleeping.') # 后产生对象 stu1 = LuffyStudent('王二丫', '女', 18) # 加上__init__方法后,实例化步骤 # 1、先产生一个空对象 stu1 # 2、LuffyStudent.__init__('王二丫', '女', 18) # 增 stu1.class_name = 'python开发' print(stu1.__dict__) # 删 del stu1.Name print(stu1.Name) # 改 stu1.Name = '李二丫' print(stu1.__dict__) print(stu1.Name) # 查 print(stu1.__dict__) print(stu1.Name) print(stu1.Sex) print(stu1.Age) stu2 = LuffyStudent('李三炮', '男', 38) # Luffycity.__init(...) stu3 = LuffyStudent('张铁蛋', '男', 48) # 对象:特征与技能的结合体 # 类:类是一系列对象相似的特征与相似技能的结合体 # 类中的数据属性:是所有对象共有的 print(LuffyStudent.school, id(LuffyStudent.school)) print(stu1.school, id(stu1.school)) print(stu2.school, id(stu2.school)) print(stu3.school, id(stu3.school)) # 类中的函数属性:是绑定给对象使用的,绑定到不同的对象是不同的绑定方法,对象调用绑定方法时会把对象本身当作第一个参数传入,传给self print(LuffyStudent.learn) LuffyStudent.learn(stu1) print(stu1.learn) print(stu2.learn) stu1.learn(1) # LuffyStudent.learn(stu1,1) # 先从对象自己里面找,找不到就去类里面找(类没有就不断地去他的父类里面找),找不到就报错,不去全局里面查找 stu1.x = 'from stu1' LuffyStudent.x = 'from luffycity class'
补充:
- 站的角度不同,定义出的类是截然不同的;
- 现实中的类并不完全等于程序中的类,比如现实中的公司类,在程序中有时需要拆分成部门类,业务类等;
- 有时为了编程需求,程序中也可能会定义现实中不存在的类,比如策略类,现实中并不存在,但是在程序中却是一个很常见的类。
# python一切皆对象,在python3里统一类与类型的概念 l = [1, 2, 3] # l = list([1,2,3]) l.append(4) # list.append(l1,4)
面向对象可扩展性总结test
# 练习1:编写一个学生类,产生一堆学生对象,(5分钟) # 要求:有一个计数器(属性),统计总共实例了多少对象 class Student: school = 'Luffycity' count = 0 def __init__(self, name, age, sex): self.Name = name self.Age = age self.Sex = sex # self.count += 1 Student.count += 1 def learn(self): print('%s is learning.'%self.name) print(Student.count) stu1 = Student('alex', 'male', 38) print(stu1.count) stu2 = Student('jinxing', 'female', 78) print(stu2.count) stu3 = Student('egon', 'male', 18) print(stu3.count) '''练习2:模拟LoL定义两个英雄类,(10分钟) 要求: 英雄要有昵称、攻击力、生命值等属性 实例化出两个英雄对象 英雄之间可以互殴,被殴打的一方掉血,血量小于0则判定死亡 ''' class Garen: camp = 'Demacia' def __init__(self, nickname, life_value, aggressivity): self.nickname = nickname self.life_value = life_value self.aggressivity = aggressivity def attack(self, enemy): enemy.life_value -= self.aggressivity class Riven: camp = 'Noxus' def __init__(self, nickname, life_value, aggressivity): self.nickname = nickname self.life_value = life_value self.aggressivity = aggressivity def attack(self, enemy): enemy.life_value -= self.aggressivity g1 = Garen('草丛伦', 100, 30) r1 = Riven('可爱的锐雯雯', 80, 50) print(r1.life_value) g1.attack(r1) print(r1.life_value)