[转载] Python3基础:08_02_面向对象编程(OOP)——类和对象
参考链接: Python中的面向对象编程OOP | 3(继承,对象示例,issubclass和super)
0.前言
这篇博文将讲述Python面向对象开发中的类与对象的概念,包括对类和对象的理解,类和对象的关系以及类和对象的创建。
加深对封装概念的理解:01_Python3中对封装的认识
1.类和对象的概念
1.1类和对象的概念 类(Class)是对一群具有相同特征或者行为的事物的一个统称,特征被称为是属性,行为被称为方法。类是抽象的,不能直接使用。 对象:是由类创建出来的一个具体的存在,可以直接使用,由哪一个类创建出来的对象,就拥有在哪一个类中的定义的属性和方法。
1.2类和对象的关系
1.类是模板,对象时根据类这个模板创建出来的。2.在程序开发中,应先有类,再有对象。3.类只有一个,对象可以有很多,不同的对象之间可以有不同的属性。4.类中定义了什么属性和方法,对象也可以拥有这些属性和方法。
类就相当于制造飞机时的图纸,是一个模板,是负责创建对象的。对象就相当于用图纸制造的飞机,是一个具体的事物。
1.3类的设计 进行程序设计之前,首先抽象分析程序需要包含哪些类,用名词提炼法抽象出类名,再分析类中应该包含哪些属性和方法。 程序开发中需要考虑三点:
①类名:这类事物的名字,应用驼峰命名法。 ②属性:这类事物具有什么样的特征。 ③方法:这类事物具有什么样的行为。 类名的确定:名词提炼法,能对一类事物概括的名词。如:动物、植物等。 属性的确定:对对象特征的描述,如人的名字、年龄、性别等。 方法的确定:对象具有的行为(动词),如人会说话、吃饭、睡觉等行为。
看第一个实例:
1.Cain今年18岁,身高175,爱跑步。 2.Cary今年17岁,身高172,爱看书。
抽象分析: 类——人类 属性——名字,年龄,身高 方法——跑步,看书 程序如下:
# 创建人类
# 创建人类
class Person:
# 创建属性
def __init__(self, new_name, new_age, new_height):
self.name = new_name
self.height = new_height
self.age = new_age
print("我叫%s,今年%d岁,身高是:%d" % (self.name, self.age, self.height))
# 创建方法
def run(self):
print("我爱跑步!")
def read(self):
print("我爱看书!")
# 创建Cain对象
Cain = Person('Cain', 18, 175)
Cain.run()
# 创建Cary对象
Cary = Person('Cary', 17, 172)
Cary.read()
运行结果: 我叫Cain,今年18岁,身高是:175 我爱跑步! 我叫Cary,今年17岁,身高是:172 我爱看书!
注意:
格式要求:类和函数体一样,需要与其他代码有两行的间距,每个方法之间也应该有一行的间距,体现Python语言的特色。程序分析:这个程序首先创建了一个人类“Person”,在这个类中创建了“名字”、“年龄”、“身高”等三个属性和“跑步”、“看书”等两个方法。后面创建了两个“人”对象“Cain”和“Cary”,创建对象时,需要传入相应的三个属性,创建好的对象可以调用类中的方法。以上Cain对象调用的方法是跑步,Cary调用的方法是看书,当然Cain也可以调用看书,Cary同样也可以跑步。 这个过程和函数调用、模块调用的过程很像,道理是相通的,这个程序看不懂没关系,看后面的分步解析。
2.内置函数方法
介绍几种常用的类的内置方法
方法名作用__new__创建对象时,会被自动调用__init__对象被初始化时,会被自动调用__del__对象被从内存中销毁前,会被自动调用__str__返回对象的描述信息,print函数输出使用
可以用dir()方法来查看一个对象有哪些内置函数方法。 可以用id()方法来查看对象的存储地址。
2.1对象属性的初始化方法__init__
使用背景:当使用类名创建对象时,会自动执行以下操作:
1.为对象在内存中分配空间–创建对象2.为对象的属性设置初始值–初始化方法__init__
应用说明:
对象的属性初始化,可以在类的内部完成,也可以在类的外部完成(不推荐,有bug)__init__方法是专门用来定义一个类具有哪些属性和方法。不需要调用,会自动调用初始化方法。在__init__方法内部使用self.属性名 = 属性的初始值 就可以定义初始属性,在定义属性之后,再用这个类创建的对象就都会有该属性。
来看一个例子:
class Person:
def __init__(self):
# self.属性名 = 属性的初始值
self.name = 'Cain'
print("我叫%s" % self.name)
# 创建Cain对象
Cain = Person()
Cary = Person()
运行结果: 我叫Cain 我叫Cain
注意: 在类的内部的初始化方法中设置了对象的初始属性,用Person()类创建的对象都会有这个初始属性。
上面的初始值是固定的,实际开发的时候要根据需求传入属性,所以在初始化方法中应该设置形参来传入初始值。
改进代码如下:
# 创建人类
class Person:
def __init__(self,name):
self.name = name
print("我叫%s" % self.name)
# 创建Cain对象
Cain = Person('Cain')
Cary = Person('Cary')
运行结果: 我叫Cain 我叫Cary
说明: 和构造函数类似,需要用形参来代替实际参数,让代码变得更加灵活。以上代码,就是在__init__方法的参数列表加入了name这个形参,再用赋值语句self.name = name 来将传入的参数赋值给初始化属性name,这样类的初始属性就是创建对象时传入的参数了,以此类推,当一个类具有多个属性时,创建对象时,也需要传入多个属性,属性与属性之间用逗号隔开。
2.2__del__方法
使用背景: 当一个对象在内存中被销毁之前,会自动调用__del__方法来销毁对象 对象的生命周期:
创建对象,生命周期开始生命周期内,可以访问对象的属性,或让对象调用方法调用__del__方法,生命周期结束
看一个例子:
class Person:
def __init__(self,name):
self.name = name
print("我叫%s,我来啦!" % self.name)
def __del__(self):
print("我叫%s,我走啦!" % self.name)
# 创建Cain对象
Cain = Person('Cain')
print('-' * 50)
运行结果: 我叫Cain,我来啦! -------------------------------------------------- 我叫Cain,我走啦!
注意: 从以上程序可以看出,解释器在完成所有程序后,会自动调用__del__函数将对象从内存中“咔嚓”掉,所以再执行完print()语句后再执行的__del__()方法。 举个例子,你出门前需要整理仪表,料理一下卫生或者其他的事,一切搞定后,需要走出家门,并关门。在这个过程中,你在家里的时候做的一系列动作,相当于代码正常运行,当你走出去时,就算是程序结束,此时就会执行__del__方法进行关门。 感觉我是强行举例了,哈哈,这个不重要,重要的是要理解这个过程,在对象消失之前,解释会自动调用__del__函数释放对象所占的空间,如果希望对象在消失之间再做一些事情,可以在__del__方法中添加这些要做的事情,比如上面的程序,离开的时候说我走了。
另外一种情况就是用del方法直接删除对象,这个类的__del__方法就会提前执行,修改一下上面的代码看看效果。
# 创建人类
class Person:
def __init__(self,name):
self.name = name
print("我叫%s,我来啦!" % self.name)
def __del__(self):
print("我叫%s,我走啦!" % self.name)
# 创建Cain对象
Cain = Person('Cain')
del Cain
print('-' * 50)
运行结果: 我叫Cain,我来啦! 我叫Cain,我走啦! --------------------------------------------------
说明: 程序提前结束了(del)对象的生命周期,对象的所占的内存提前释放了,所以类中的__del__方法也提前执行了,通过这个例子应该对__del__方法的理解更加深刻了吧。
2.3__str__方法
使用背景: 如果希望用print()输出对象变量时,能够打印自定义的内容,就需要用到__str__这个方法了,需要注意的是__str__方法返还值必须是一个字符串。 不好理解话,就看例子吧:
class Person:
def __init__(self, name):
self.name = name
"""
def __str__(self):
return ("我是一个名为:%s的人类" % self.name)
"""
# 创建Cain对象
Cain = Person('Cain')
print(Cain)
加上多行注释运行结果: <__main__.Person object at 0x000002248C561390>
不加多行注释运行结果: 我是一个名为:Cain的人类
说明: 不用__str__方法直接用print()打印对象的话,输出的是对象的存储地址,如果加上__str__方法的话,用print()打印对象的结果就是我们自定义字符串了。
时间:2019年5月2日21:43:10
[转载] Python3基础:08_02_面向对象编程(OOP)——类和对象相关推荐
- 八、Java面向对象编程(类、对象、方法、重载、可变参数、作用域、构造器、this本质)
文章目录 Java面向对象编程(类.对象.方法.重载.可变参数.作用域.构造器.this本质) 一.类与对象 1. 类与对象的引出 2. 使用现有技术解决 3. 现有技术解决的缺点分析 4. 类与对象 ...
- ES6学习笔记(一):轻松搞懂面向对象编程、类和对象
文章目录 面向过程编程P OP(Process oriented programming) 面向对象编程OOP(Object Oriented Programming) ES6中的类和对象 面向对象 ...
- 用《叩响C#之门》复习C#基础知识 第八章 面向对象编程:类和对象(二)
1.以对象为成员 类的成员不光可以是int.double等基本类型的变量,也可以是其他类的对象.其实也就是说,类的成员可以是所有的值类型和引用类型的成员变量. 2.静态成员 1)静态变量:描述类的整体 ...
- 【Python】Python语言学习:面向对象编程,类和对象,封装、继承和多态
这一周Python语言学习,记录如下. 01 面向对象编OOP 1.1 为什么学习和应用OOP? 1 OOP适合更加复杂的需求分析和项目开发. 2 OOP具有更强大的封装能力. 3 OOP相比于面向过 ...
- python进阶《面向对象编程》类和对象
目录 零.前言 一.面向对象编程 (一)概念理解 二.类和对象的概念 (一)面向对象的两个重要概念类和对象. (二)类的解释 1.创建类 2.类属性(区别于下面的对象属性) (三)对象的解释 ...
- 初学者python笔记(面向对象编程、类与对象)
文章目录 面向对象设计 类与对象的概念 1.类与对象的本质 2.面向对象设计 到 面向对象编程 3.类实例化 4.例如一个学校类 面向对象编程 1.案例 2.面向对象语言和面向对象编程之间的关系 3. ...
- day16 初识面向对象编程(类与对象、构造函数与对象,类与类)
目录 一.面向对象和面向过程的区别 二.类与对象的概念 三.构造函数和对象的关系 三.类与类的关系:组合 四.类与类的关系:依赖 一.面向对象和面向过程的区别 面向过程:强调过程步骤 面向对象:强调对 ...
- Kotlin系列二:面向对象编程(类与对象)
目录 一 类与对象 二 延迟初始化属性与变量 三 继承 四 构造函数 4.1 主构造函数 4.2 次构造函数. 五 接口 六 数据类与单例类 6.1 数据类 6.2 单例类 七 密封类 八 嵌套类与 ...
- python oop编程_23 Python - 面向对象编程OOP
面向对象编程OOP 01 方法__repr__()和__str__() __repr__()方法类似java中的toString方法,用于反馈类的相关信息且可以自己定义,一般用于开发人员控制台调试 _ ...
最新文章
- Java从基础进阶到高手
- 驰骋工作流引擎设计系列10时效考核规则设计
- Java加密算法 AES
- 互联网1分钟 |1214
- artTemplate的使用总结
- 7、ABPZero系列教程之拼多多卖家工具 修改注册功能
- ArcGIS中国工具(ArcGISCTools)3.2 安装教程(附安装包下载)
- Exynos4412裸机开发——中断处理
- python进程socket通信_python实现多进程通信实例分析
- netpref 使用_使用PrefView监测.NET程序性能(一):Event Trace for Windows
- SSAS实践问题记录--后端数据库访问模块中存在错误。 为绑定指定的大小太小,导致一个或多个列值被截断。
- PWM波、方波的输出与捕获
- 区块链入门(一)------ 区块链简介(持续更新)
- 阅读器安装三方APK指导
- UI常见面试题-整体素养篇
- 操作系统安装磁盘清理方法
- unity reflect_Unity Reflect在这里
- 我们公司没销售 - 疫情下企业软件的互联网营销
- 腾讯视频转换mp4格式用什么转换器?电脑怎么把腾讯视频转换成mp4?
- 物联网笔记,基于华为云IOT