面向对象(OOP)基本概念

面向对象编程 —— Object Oriented Programming 简写 OOP

目标
了解 面向对象 基本概念

  1. 面向对象基本概念
    我们之前学习的编程方式就是 面向过程 的
    面相过程 和 面相对象,是两种不同的 编程方式
    对比 面向过程 的特点,可以更好地了解什么是 面向对象
    1.1 过程和函数(科普)
    过程 是早期的一个编程概念
    过程 类似于函数,只能执行,但是没有返回值
    函数 不仅能执行,还可以返回结果
    1.2 面相过程 和 面相对象 基本概念
  1. 面相过程 —— 怎么做?
    把完成某一个需求的 所有步骤 从头到尾 逐步实现
    根据开发需求,将某些 功能独立 的代码 封装 成一个又一个 函数
    最后完成的代码,就是顺序地调用 不同的函数
    特点

注重 步骤与过程,不注重职责分工
如果需求复杂,代码会变得很复杂
开发复杂项目,没有固定的套路,开发难度很大!
001_面向过程

  1. 面向对象 —— 谁来做?
    相比较函数,面向对象 是 更大 的 封装,根据 职责 在 一个对象中 封装 多个方法

在完成某一个需求前,首先确定 职责 —— 要做的事情(方法)
根据 职责 确定不同的 对象,在 对象 内部封装不同的 方法(多个)
最后完成的代码,就是顺序地让 不同的对象 调用 不同的方法
特点

注重 对象和职责,不同的对象承担不同的职责
更加适合应对复杂的需求变化,是专门应对复杂项目开发,提供的固定套路
需要在面向过程基础上,再学习一些面向对象的语法

面相对象基础语法

目标
dir 内置函数
定义简单的类(只包含方法)
方法中的 self 参数
初始化方法
内置方法和属性

  1. dir 内置函数(知道)
    在 Python 中 对象几乎是无所不在的,我们之前学习的 变量、数据、函数 都是对象
    在 Python 中可以使用以下两个方法验证:

在 标识符 / 数据 后输入一个 .,然后按下 TAB 键,iPython 会提示该对象能够调用的 方法列表
使用内置函数 dir 传入 标识符 / 数据,可以查看对象内的 所有属性及方法
提示 方法名 格式的方法是 Python 提供的 内置方法 / 属性,稍后会给大家介绍一些常用的 内置方法 / 属性

序号 方法名 类型 作用
01 new 方法 创建对象时,会被 自动 调用
02 init 方法 对象被初始化时,会被 自动 调用
03 del 方法 对象被从内存中销毁前,会被 自动 调用
04 str 方法 返回对象的描述信息,print 函数输出使用
提示 利用好 dir() 函数,在学习时很多内容就不需要死记硬背了

  1. 定义简单的类(只包含方法)
    面向对象 是 更大 的 封装,在 一个类中 封装 多个方法,这样 通过这个类创建出来的对象,就可以直接调用这些方法了!

2.1 定义只包含方法的类
在 Python 中要定义一个只包含方法的类,语法格式如下:
class 类名:

def 方法1(self, 参数列表):passdef 方法2(self, 参数列表):pass

方法 的定义格式和之前学习过的函数 几乎一样
区别在于第一个参数必须是 self,大家暂时先记住,稍后介绍 self
注意:类名 的 命名规则 要符合 大驼峰命名法

2.2 创建对象
当一个类定义完成之后,要使用这个类来创建对象,语法格式如下:
对象变量 = 类名()
2.3 第一个面向对象程序
需求

小猫 爱 吃 鱼,小猫 要 喝 水
分析

定义一个猫类 Cat
定义两个方法 eat 和 drink
按照需求 —— 不需要定义属性
004_Cat类1

class Cat:"""这是一个猫类"""def eat(self):print("小猫爱吃鱼")def drink(self):print("小猫在喝水")tom = Cat()
tom.drink()
tom.eat()

引用概念的强调
在面向对象开发中,引用的概念是同样适用的!

在 Python 中使用类 创建对象之后,tom 变量中 仍然记录的是 对象在内存中的地址
也就是 tom 变量 引用 了 新建的猫对象
使用 print 输出 对象变量,默认情况下,是能够输出这个变量 引用的对象 是 由哪一个类创建的对象,以及 在内存中的地址(十六进制表示)
提示:在计算机中,通常使用 十六进制 表示 内存地址

十进制 和 十六进制 都是用来表达数字的,只是表示的方式不一样
十进制 和 十六进制 的数字之间可以来回转换
%d 可以以 10 进制 输出数字
%x 可以以 16 进制 输出数字
案例进阶 —— 使用 Cat 类再创建一个对象
lazy_cat = Cat()
lazy_cat.eat()
lazy_cat.drink()
提问:tom 和 lazy_cat 是同一个对象吗?

  1. 方法中的 self 参数
    3.1 案例改造 —— 给对象增加属性
    在 Python 中,要 给对象设置属性,非常的容易,但是不推荐使用
    因为:对象属性的封装应该封装在类的内部
    只需要在 类的外部的代码 中直接通过 . 设置一个属性即可
    注意:这种方式虽然简单,但是不推荐使用!

tom.name = “Tom”

lazy_cat.name = “大懒猫”
3.2 使用 self 在方法内部输出每一只猫的名字
由 哪一个对象 调用的方法,方法内的 self 就是 哪一个对象的引用

在类封装的方法内部,self 就表示 当前调用方法的对象自己
调用方法时,程序员不需要传递 self 参数
在方法内部
可以通过 self. 访问对象的属性
也可以通过 self. 调用其他的对象方法
改造代码如下:

class Cat:def eat(self):print("%s 爱吃鱼" % self.name)tom = Cat()
tom.name = "Tom"
tom.eat()lazy_cat = Cat()
lazy_cat.name = "大懒猫"
lazy_cat.eat()

005_方法中的self

在 类的外部,通过 变量名. 访问对象的 属性和方法
在 类封装的方法中,通过 self. 访问对象的 属性和方法
04. 初始化方法
4.1 之前代码存在的问题 —— 在类的外部给对象增加属性
将案例代码进行调整,先调用方法 再设置属性,观察一下执行效果

tom = Cat()
tom.drink()
tom.eat()
tom.name = "Tom"
print(tom)

程序执行报错如下:
AttributeError: ‘Cat’ object has no attribute ‘name’
属性错误:‘Cat’ 对象没有 ‘name’ 属性
提示

在日常开发中,不推荐在 类的外部 给对象增加属性
如果在运行时,没有找到属性,程序会报错
对象应该包含有哪些属性,应该 封装在类的内部
4.2 初始化方法
当使用 类名() 创建对象时,会 自动 执行以下操作:
为对象在内存中 分配空间 —— 创建对象
为对象的属性 设置初始值 —— 初始化方法(init)
这个 初始化方法 就是 init 方法,init 是对象的内置方法
init 方法是 专门 用来定义一个类 具有哪些属性的方法!

在 Cat 中增加 init 方法,验证该方法在创建对象时会被自动调用

class Cat:"""这是一个猫类"""def __init__(self):print("初始化方法")

4.3 在初始化方法内部定义属性
init 方法内部使用 self.属性名 = 属性的初始值 就可以 定义属性
定义属性之后,再使用 Cat 类创建的对象,都会拥有该属性

class Cat:def __init__(self):print("这是一个初始化方法")# 定义用 Cat 类创建的猫对象都有一个 name 的属性self.name = "Tom"def eat(self):print("%s 爱吃鱼" % self.name)#使用类名()创建对象的时候,会自动调用初始化方法 __init__
tom = Cat()tom.eat()

4.4 改造初始化方法 —— 初始化的同时设置初始值
在开发中,如果希望在 创建对象的同时,就设置对象的属性,可以对 init 方法进行 改造
把希望设置的属性值,定义成 init 方法的参数
在方法内部使用 self.属性 = 形参 接收外部传递的参数
在创建对象时,使用 类名(属性1, 属性2…) 调用

class Cat:def __init__(self, name):print("初始化方法 %s" % name)self.name = name...tom = Cat("Tom")
...lazy_cat = Cat("大懒猫")
...
  1. 内置方法和属性
    序号 方法名 类型 作用
    01 del 方法 对象被从内存中销毁前,会被 自动 调用
    02 str 方法 返回对象的描述信息,print 函数输出使用
    5.1 del 方法(知道)
    在 Python 中

当使用 类名() 创建对象时,为对象 分配完空间后,自动 调用 init 方法
当一个 对象被从内存中销毁 前,会 自动 调用 del 方法
应用场景

init 改造初始化方法,可以让创建对象更加灵活
del 如果希望在对象被销毁前,再做一些事情,可以考虑一下 del 方法
生命周期

一个对象从调用 类名() 创建,生命周期开始
一个对象的 del 方法一旦被调用,生命周期结束
在对象的生命周期内,可以访问对象属性,或者让对象调用方法

class Cat:def __init__(self, new_name):self.name = new_nameprint("%s 来了" % self.name)def __del__(self):print("%s 去了" % self.name)#tom 是一个全局变量
tom = Cat("Tom")
print(tom.name)#del 关键字可以删除一个对象
del tomprint("-" * 50)

5.2 str 方法
在 Python 中,使用 print 输出 对象变量,默认情况下,会输出这个变量 引用的对象 是 由哪一个类创建的对象,以及 在内存中的地址(十六进制表示)
如果在开发中,希望使用 print 输出 对象变量 时,能够打印 自定义的内容,就可以利用 str 这个内置方法了
注意:str 方法必须返回一个字符串

class Cat:def __init__(self, new_name):self.name = new_nameprint("%s 来了" % self.name)def __del__(self):print("%s 去了" % self.name)def __str__(self):return "我是小猫:%s" % self.nametom = Cat("Tom")
print(tom)

面向对象(OOP)基本概念及基本语法相关推荐

  1. 面向对象(OOP)基本概念

    面向对象(OOP)基本概念 {#toc_0} 面向对象编程 ------ Object Oriented Programming 简写 OOP 目标 {#toc_1} 了解 面向对象 基本概念 面向对 ...

  2. Python 面向对象(OOP)基本概念

    面向对象编程 -- Object Oriented Programming 简称 OOP 目标 了解 面向对象 基本概念 0.1 面向对象基本概念 面向过程 和 面向对象,是两种不同的 编程方式 对比 ...

  3. Python使用---面向对象OOP(类和对象)--完善中

    来源于此 目录 1.面向对象(OOP)基本概念 1.1 过程和函数(科普) 1.2 面相过程 和 面相对象 基本概念 2 类和对象 2.1 类 2.2 对象 2.3 类和对象的关系 3 类的设计 4 ...

  4. java基础(三):java面向对象OOP

    java面向对象OOP 基本概念 面向过程与面向对象 面向过程:关注代码实现的细节.复用性 面向对象:先把每个过程的代码实现细节整合到对象中,只要找到对象就能拥有对象身上所有的功能. 面向对象基于面向 ...

  5. 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)...

    译文出处:http://www.codeproject.com/Articles/838365/Basic-Csharp-OOP-Concept 相关文档:http://files.cnblogs.c ...

  6. python中什么叫类、什么叫对象_python中的类面向对象的基本概念!

    一.概述 今天我们讲述Python中的类&面向对象的基本概念. 首先我们为什么要学习面向对象,我讲一个故事,应该就可以明白了.在古时候,官府衙门如果要颁布什么告示就会去找工匠将命令中的字都雕刻 ...

  7. 第一阶段:Java基础总复习一一一和一一一面向对象OOP总复习

    一.Java基础 0.Maven的介绍: 官网:https://maven.apache.org/download.cgi (1)Maven是什么? Maven 是 Apache 开源组织奉献的一个开 ...

  8. java面向对象oop阶段总结

    名词解释 笔记0927 *对象数组起始位置可以初始化几个元素 // 1.功能五 判断队名是否重复2.给队起名:3.队伍建队用flag循环判断是否队伍已满: 2.功能六 遍历二维数组子元素的方法 *3. ...

  9. 面向对象程序设计基本概念

    面向对象程序设计基本概念 重点: C++中的 多态 和 指针间接赋值 1): 多态的三个条件         a: 子类继承父类         b: 虚函数(虚表及虚表指针)         c: ...

最新文章

  1. ARM-CPU卷积网络的自动调谐
  2. 吴恩达深度学习笔记(109)-循环神经网络模型(RNN介绍)
  3. 最全芯片产业报告出炉,计算、存储、模拟IC一文扫尽
  4. 函数重载(续)==》函数重载和函数指针在一起
  5. java static用法_Java中static关键字的作用和用法详细介绍
  6. pta-2、求三角形面积及周长 (10 分)
  7. 【面向对象】第三单元总结——JML
  8. 微型计算机控制系统常用报警方式,微型计算机控制技术复习资料.docx
  9. 使用requests通过代码实现接口测试自动化
  10. 让 Code Review成为一种习惯
  11. Linux 将某个文件夹授予某个用户读写权限
  12. 什么可以代替pencil?pencil的平替推荐
  13. 集团企业税务管理浅析
  14. 软件如何进行压力测试,软件如何进行压力测试?
  15. 导航栏 下拉菜单的制作
  16. 揭秘:“苏宁拼购基地”落地全国的原因
  17. 奇虎360:5年前赴美上市到今私有化退市,未来路在何方?
  18. Jmeter(二十三) - 从入门到精通 - JMeter函数 - 上篇(详解教程)
  19. Vertica—操作汇总
  20. RDD简介,spark-shell,spark-submit提交任务简单示例

热门文章

  1. flex +overflow在firefox与edge中不生效的问题
  2. OpenCV3.1.0+VS2013测试程序
  3. 【李宏毅2020 ML/DL】P57 Unsupervised Learning - Linear Methods | PCA Matrix Factorization
  4. 极酷WIFI深度剖析免费WIFI
  5. ios assign、copy 、retain
  6. java jdbc 占位符_java-jdbc
  7. (原创)sqlite封装库SmartDB1.3发布
  8. python邮件模块_Python收发邮件模块,用,来,发送,接收
  9. Linux修改时区和时间
  10. signature=0727ee8cc38ba70036807ebbc0b018d6,NMSSM+