1、初识面向对象
面向过程:一切以事务的发展流程为中心
优点:负责的问题流程化,编写相对简单
缺点:可扩展性差,只能解决一个问题,改造也会很困难,牵一发而动全身。
面向对象:一切以对象为中心,一切皆为对象,具体的某一个事务就是对象。
我们面向的不再是事务发展的流程,而是操作某一个事务的个体
优点:可扩展性强,对某一个对象单独修改会立刻反映到整个体系中。对属性和动作修改都很容易
缺点:编程的复杂度高于面向过程,可控性差。无法像面向过程的程序设计流水线式可以很精准的预测问题的处理流程和结果。
面向对象的应用场景:需求经常变化的软件,一般需求都集中在用户层,互联网应用,企业内部软件,游戏等。
2、类,对象
类是创建对象的第一步,对象就是通过类来创造的具体的东西。
类与对象的关系:类是对事务的总结,抽象的概念,类用来描述对象,对象是类的实例化的结果,对象能执行那些方法都由类来决定,类中定义了什么,对象就拥有什么。
__init__(self,参数) 参数一般作为属性设置给对象,对象就是self,对象性的封装。 def 方法(self,参数): 方法,第一个参数一般是固定的self,当前类的对象
创建类:
class 类名: def __init__(self): # 初始化方法,又被称为构造方法 self.属性 = 值 self.属性 = 值 self.属性 = 值 def fangfa(self): 方法体(函数体,return)
创建对象:
变量 = 类名() #实例化 <--> 创建 变量.属性 # 访问对象的属性信息 变量.方法() # 访问类中的方法
下面以造车来举例:
class Car: # 类名首字母大写,严格遵守驼峰命名规则 pass # 造车 c = Car() #类名() 表示创建对象 c.color = 'red' # 对象.属性 中间的点表示‘的’ ,当属性不存在的时候,相当于添加一个属性 c.paizhao = '京A888888' print(c.color) print(c.paizhao) c.color = 'blue' # 当属性存在的时候,是修改属性星系 # 相当于一个字典,属性为key,等号后边的内容为value
class User: def __init__(self,username,password): self.username = username self.password = password def login(self): uname = input('请输入用户名:') passw = input('请输入密码') if uname == self.username and passw == self.password: print('登陆成功') else: print('登陆失败') info = User('zhangmeng','ni123') info.login()
用面向对象的思维完成用户登录
class User: def __init__(self,username,password): self.username = username self.password = password def login(self): uname = input('请输入用户名:') passw = input('请输入密码') if uname == self.username and passw == self.password: print('登陆成功') else: print('登陆失败') info = User('zhangmeng','ni123') info.login()
3、面向对象 和面向过程的比对
1、函数式:函数侧重的是功能,将功能封装到函数中,调用方便
2、面向对象编程:对象侧重的是归类;对整个系统进行分析,分析出需要哪些对象,然后给对象进行分类
先写类,然后使用类创建对象,最后用对象去执行相关操作。
python同时支持面向对象和面向过程:
如果写一些比较小的程序用面向对象,程序很复杂,很庞大,建议用面向过程
4、面向对象的三大特征
封装
把很多数据封装到一个对象中,把固定功能的代码封装到一个代码块,函数。对象,打包成模块
1、对属性的封装(__init__())
self.xxx = xxx
2、对方法和功能的封装
class Student: def __init__(self,name,ID,grade): self.name = name self.ID = ID self.grade = grade stu1 = Student('张欣','001','三年级') # 把多个信息(值)保存在一个对象中 stu2 = Student('黄瑶','009','六年级') def choose(s): print('选择%s去参加竞赛'%s.name) choose(stu1)
继承
子类自动拥有父类中除了私有属性外的其他所有内容,对父类进行扩展。
父类的对象不能执行子类中的功能
当出现x是一种y的时候,推荐使用继承关系
python支持多继承,查找顺序:先找离它近的
class foo: def getmoney(self): print('快到碗里来') class bar(foo): pass c = bar() c.getmoney() # 快到碗里来
多态
同一个对象,多种形态。
好处:程序具有超高的可扩展性,面向对象思想的核心与灵魂,python自带多态。
# 封装,继承,多态 class Animal: def run(self): print('动物在跑') def chi(self): print('动物在吃') class Cat(Animal): def __init__(self,name,color,hobby): self.name = name self.color = color self.hobby = hobby class Dog(Animal): def __init__(self,name,color,hobby): self.name = name self.color = color self.hobby = hobby def chi(self): print('吃吃吃') c = Cat('xiaomei','红色','偷吃鱼') d = Dog('budian','黑色','咬东西') def func(ani): ani.chi() func(c) func(d)