一天学会python面向对象,一篇文章就够了
面向对象基础
- 面向对象编程
Object Oriented Programming
简写OOP
- 面向过程和面向对象,是两种不同的编程方式
1)过程和函数
- 过程是早期的一个编程概念
- 过程类似于函数,只能执行,但是没有返回值
- 函数不仅能执行,还可以返回结果
2)面向过程 和 面向对象
1>面向过程(怎么做)
- 把完成某个需求的 所有步骤 从头到尾 逐步实现
- 根据开发需求,将某些功能独立的代码封装成一个个函数
- 最后完成的代码,就是顺序地调用不同的函数
- 特点:
- 注重步骤与过程,不注重职责分工
- 如果需求复杂,代码也会变得复杂
- 没有固定的套路,开发复杂项目时难度很大
2>面向对象(谁来做)
面向对象是更大的封装,根据职责在一个对象中封装多个方法
- 在完成某一个需求前,首先确定职责==>要做的事情(方法)
- 根据职责确定不同的对象,在对象内部封装不同的方法
- 最后完成的代码,就是顺序地让不同的对象调用不同的方法
- 特点:
- 注重对象和职责,不同的对象承担不同的职责
- 更加适合应对复杂的需求变化,是专门应对复杂项目开发,提供的固定套路
- 需要在面向过程基础上,再学习一些面向对象的语法
游戏中,每个角色的技能职责不同,就很像这一个个对象。它们的技能就是各种方法。
3>类和对象
1.类
- 类是对一群具有相同特征或者行为的事物的一个统称,是抽象的,不能直接使用
- 特征被称为属性(变量)
- 行为 被称为方法(函数)
- 类是一个模板,负责创建对象(实例)
2.对象
- 对象是有类创建出来的一个具体存在,可以直接使用
- 类创建的对象,拥有类的属性和方法
- 在程序开发中,先有类,后有对象
3.类和对象的关系
- 类和对象的区别,也类似于 人类 和 某个具体的人的区别
- 由一个类创建的对象可以有很多个
- 不同的对象之间属性可能会各不相同
- 类中定义了什么属性和方法,对象中就有什么属性和方法,不可能多,也不可能少
4.类的设计
- 分析需求,确定一下,程序中需要包含哪些类
- 类的设计三要素
- 类名:大驼峰命名法
- 属性:事物的特征
- 方法:事物的行为
- 名词提炼法分析整个业务流程,出现的名词,基本就可以作为类名
需求中没有涉及的属性或者方法在设计类时,不需要考虑
- 鸡有翅膀,身体上有羽毛,喜欢抬眉
- 狗没有翅膀,身体上有狗毛,喜欢抬尾巴
5.查看方法的函数dir()
python
中,一切皆是对象- dir(标识符/数据)==>查看对象内的所有属性及方法
提示__方法名__
格式的方法是python
提供的内置方法/属性
方法名 | 类型 | 作用 |
---|---|---|
__new__ | 方法 | 创建对象时,会被 自动 调用 |
__init__ | 方法 | 对象被初始化时,会被 自动 调用 |
__del__ | 方法 | 对象被从内存中销毁前,会被 自动 调用 |
__str__ | 方法 | 返回对象的描述信息,print 函数输出使用 |
__doc__ | 方法 | 对象中的文档说明 |
4>定义类
- 定义类
Class 类名:
变量1 = 值1
变量2 = 值2
def 方法1(self,参数列表):
pass
def 方法2(self,参数列表):
pass
- 创建对象(类的实例化)
对象名(是一个变量) = 类名()
- 面向对象开发的特点:只负责让对象去工作,而不再关心方法的内部细节
- 面向对象开发中,引用的概念同样适用。对象变量记录的依然是对象在内存中的地址
print(one_class) # <__main__.OneClass object at 0x01BAC2D0>
上面的print函数打印了一个对象,其显示的结果是:该对象所属的类 at 内存中的地址(十六进制表示)
- print("%d" % 变量名) # 输出10进制地址
- print("%x" % 变量名) # 输出16进制地址
5>self参数
1. 给对象增加属性
- 在python中,要给对象设置属性,非常容易,!!!不推荐使用!!!(对象属性的封装一个封装在类的内部)
- 只需要在类的外部的代码中直接通过赋值语句设置一个属性即可
实例名.新属性名 = 属性值
- **在外部增加对象属性的隐患:**在类外部给对象增加属性,目的肯定是为了使用。为了使用,类里面的方法,肯定就会引用数据(属性),如果忘了在外部传入某属性,那么程序就会报错。
- 提示:
- 在日常开发中,对象应该包含哪些属性,应该封装在类的内部
2. self保存了什么
- 通过单步调试工具,会发现self的内存地址和调用方法的实例对象的内存地址一模一样。说明:
- self 本来就是一个形参,它传入的参数是实例对象
- 哪一个对象调用的方法,self就是哪一个方法的引用
- 在方法内部,要访问对象的属性或方法加上个
self.
即可
6>几个内置方法与对象的生命周期
1.初始化方法__init__
- 当使用
类名()
创建一个实例时,会自动执行以下操作:
- 为对象在内存中分配空间==>创建对象
- 为对象的属性设置初始值==>初始化方法(
__init__
)
__init__
是对象的内置方法
__init__
方法是专门用来定义一个类具有哪些属性的方法!
class 类1:
def __init__(self, 形参1):
self.属性1 = 形参1
# 实例化
实例1 = 类1(参数1)
- 如果希望在创建对象的同时,就设置对象的属性,可以对__init__方法进行改造
- 把希望设置的属性值,定义成初始化函数的参数
- 在方法内部使用 self.属性名 = 形参名 接收外部传递的参数
- 在创建对象时,使用 类名(属性1,属性2…) 调用
2.销毁前方法__del__
- 当一个对象从内存中销毁前,会自动调用__del__方法
- 一个实例是一个全局变量,所以只有所有程序执行完成时,才会被回收。也就是程序所有操作的最后,才会调用__del__方法。(也可以使用del关键字强制回收,回收时,触发__del__方法)
class VClass:
"这是一个对象"
def __init__(self, arg):
self.arg = arg
print("%s 初始化成功" % self.arg)
def __del__(self):
print("%s 成功被销毁" % self.arg)
A_class = VClass("A对象")
# 打印在终端的结果显示: 分割线在A对象销毁的上方,说明整个程序结束才销毁 A_class 对象
print("=" * 50)
B_class = VClass("B对象")
del B_class
# 打印在终端的结果显示: 分割线在B对象销毁的下方,说明del提前回收了 B_class 对象
print("*" * 50)
3. 生命周期
- 一个对象从被创建时,生命周期开始
- 在对象的生命周期内,可以访问对象属性,或者人对象调用方法
4.打印自定义的内容__str__
- python使用print打印一个对象会返回 <main.类名 object at 实例所在内存地址>
- 如果希望print打印这个对象时,输入我们自定义的内容,就可以用__str__函数
- __str__函数返回的对象,必须是一个字符串
class VClass:
"这是一个对象"
def __init__(self, arg):
self.arg = arg
print("%s 初始化成功" % self.arg)
def __del__(self):
print("%s 成功被销毁" % self.arg)
def