Python程序开发——第六章 类与对象
目录
- 一、类
- (一)类、对象
- (二)类的定义
- (三)对象的创建和使用
- 二、限制对象访问
- (一)定义私有成员、方法
- (二)访问私有成员、方法
- 三、构造方法和析构方法
- (一)构造方法
- (二)析构方法
- 四、类方法和静态方法
- (一)类方法
- (二)静态方法
- 五、继承
- (一)多继承
- (二)派生类方法重写
- (三)super()函数
- 六、多态
一、类
(一)类、对象
Python是一种面向对象语言,面向对象有两个概念,分别是类和对象。
类是对多个对象的共同特征的抽象描述,可以说类是对象的模板
。
对象是类的实例
,用于描述现实中的个体。
(二)类的定义
根据类与对象的关系,我们知道创建对象之前需先定义类,类中可以定义数据成员和成员函数,前者用于描述对象特征,称为属性,后者用于描述对象行为,称为方法,类中的方法的第一个参数必须为self
,这种方法也叫实例方法
,只能通过类实例化的对象进行调用。
class 类的名称属性名称=属性值def 方法名称(self): #self是一个指向对象的默认参数,类中必须包含参数 self, 且为第一个参数。方法体
例如,下列代码定义了一个类,名称为Way,该类包含一个属性number_way、一个方法world():
class Way:number_way = 3def world(self):print("hello world!")
(三)对象的创建和使用
创建对象:
对象名称=类名称()
访问对象成员:
对象名称.属性
对象名称.方法()
例如,创建一个Way类的对象a,访问该对象成员:
class Way:number_way = 3def world(self):print("hello world!")a = Way()
print(a.number_way)
a.world()
输出结果如下:
二、限制对象访问
(一)定义私有成员、方法
定义类中的属性和方法默认为公有属性
和公有方法
,该类中的对象可以任意访问类中的公有成员和公有方法,可以通过将成员和方法定义为私有,即私有成员和私有方法,从而限制对象对类的访问
。
通过在类成员名称或类方法名称前面加上双下划线__
限制成员的访问,即定义为私有成员和私有方法,如下:
class Way:__number_way = 3def __world(self):print("hello world!")
(二)访问私有成员、方法
这里要注意,实例化的对象是无法直接访问类中的私有成员和私有方法的,它们都可通过公有方法中的参数self调用
。
例如,下列python代码,定义了一个私有成员__number_way和一个私有方法__world()以及一个公有方法get_way():
class Way:__number_way = 3def __world(self): # 私有方法print("hello world!")def get_way(self): # 公有方法print(f"number_way的值为:{self.__number_way}") # 私有成员通过公有方法中的指代类本身的默认参数self访问self.__world() # 私有方法通过公有方法中的指代类本身的默认参数self访问a = Way()
a.get_way()
输出结果如下:
三、构造方法和析构方法
类中有两个名为 __init__()
和__del__()
的特殊方法,它们分别是构造方法
和析构方法
,该两种方法在类创建
和销毁
时会自动调用
。
(一)构造方法
每个定义的类中都有一个默认的__init__()构造方法,如果在定义类时未定义,则系统会调用默认的构造方法,而如果用户在定义时显式地定义了构造方法,则会调用该定义的构造方法。
可以通过无参构造方法
和有参构造方法
来分别对该方法创建的对象赋予相同
的初始值和不同
的初始值。
注:这里按照参数的有无分为两种构造方法,但除了self,因为类中必须包含参数 self, 且为第一个参数。
下列python代码,Triangle类中显式地定义了带参数的构造方法和一个get_s()方法:
class Triangle:def __init__(self, bottom, high):self.bottom = bottomself.high = highdef get_s(self):s = (self.bottom * self.high) / 2.0print(f"三角形的面积为:{s}")S = Triangle(1.5, 2)
print(S.bottom, S.high)
S.get_s()
运行结果如下:
(二)析构方法
对象被清理时,系统会自动调用析构方法,即对象在内存中被释放时自动触发执行__del__()析构方法
。
下列python代码,Triangle类中显式地定义了带参数的构造方法和一个get_s()方法以及一个析构方法,析构方法打印输出__del__()方法被调用:
class Triangle:def __init__(self, bottom, high):self.bottom = bottomself.high = highprint("__init__()方法被调用")def __del__(self):print("__del__()方法被调用")def get_s(self):s = (self.bottom * self.high) / 2.0print(f"三角形的面积为:{s}")S = Triangle(1.5, 2)
print(S.bottom, S.high)
运行结果如下,可知道对象在被销毁时自动调用了__del__()析构方法:
四、类方法和静态方法
(一)类方法
类方法通过装饰器@classmethod修饰
,它的第一个参数并非类本身self,而是cls
。
与实例方法不一样,它既可由类实例化的对象调用,也可由类调用,且类方法可以修改类属性
,而实例方法不能。
如下代码,通过对象名称调用类方法,直接通过类调用类方法且通过类方法修改类属性word的值:
class GetW:word = "hello world!"@classmethoddef print_word(cls):print(f"{cls.word}")cls.word = "HELLO WORLD!" # 类方法修改类属性的值为HELLO WORLD!A = GetW() # 创建一个GetW类的对象A
print("通过类实例化的对象调用:")
A.print_word()
print("通过类调用:")
GetW.print_word()
运行结果如下:
(二)静态方法
首先静态方法与类方法一样,既可由类实例化的对象调用,也可由类调用。静态方法没有self参数,是通过装饰器@classmethod修饰
。
由于没有默认参数,所以它无法使用默认参数来访问类成员。
下列python代码:
class Get:number = 0@staticmethoddef print_number():print(f"{Get.number}")A = Get()
A.print_number()
Get.print_number()
运行结果如下:
五、继承
类和类可以继承,继承(派生)的类的称为派生类或子类
,被继承的类称为基类或父类
。
由于是继承下来的,所以派生类具有基类的所有属性和方法,继承的格式如下:
class 派生类名称(基类名称):
例如,下列python代码,定义了基类Employee和子类teacher,通过class Teacher(Employee)来继承基类Employee中的属性和方法,另外派生类中还有自己定义的属性和方法:
class Employee:place = "office"def get_word(self):print(f"{self.place}")class Teacher(Employee): # 继承Employee类student_num = 50 # 子类自己定义的属性def get_word_num(self): # 子类自己定义的方法print(f"教师办公地点为{self.place}")print(f"学生人数为{self.student_num}")A = Teacher()
print(Teacher.place) # 子类继承了父类的属性,所以子类有父类的属性
A.get_word() # 子类继承了父类的方法,所以子类有父类的方法
print(Teacher.student_num) # 输出子类自己定义的属性
A.get_word_num() # 调用子类自己定义的方法
输出结果如下,可以看出继承基类后,派生类既可以调用自己的方法,也能调用所继承基类中的方法:
(一)多继承
多继承指一个派生类继承多个基类,多继承的格式为class 派生类(基类1,基类2……)
。
(二)派生类方法重写
当基类中的方法无法满足派生类中的要求时,可以重写
基类的方法,重写后的基类原方法并未改变。
例如下列python代码,派生类teacher中重写基类中的get_word()方法:
class Employee:place = "office"@classmethoddef get_word(cls):print(f"{cls.place}")class Teacher(Employee):student_num = 50def get_word(self):print(f"{self.student_num}")A = Teacher()
Employee.get_word()
A.get_word()
Employee.get_word()
运行结果如下,重写基类中的get_word()方法后,并未改变该方法:
(三)super()函数
可以通过super()函数,在派生类重写基类的方法后,仍可调用基类中的方法。
下列python代码:
class Employee:place = "office"@classmethoddef get_word(cls):print(f"{cls.place}")class Teacher(Employee):student_num = 50def get_word(self):print(f"{self.student_num}")print("使用super()函数调用基类中的方法:")super().get_word()A = Teacher()
A.get_word()
运行结果如下,可以看到通过super()函数调用已经被派生类teacher重写的基类方法get_word():
六、多态
多态指不考虑对象类型并使用该对象,让具有不同功能的函数使用相同的函数名称,从而通过函数名称调用不同功能的函数。
下列python代码,通过Person类中的get_word()方法中的name参数,传给name参数是目标类的实例对象即调用该类的get_word()方法:
class Person:def get_word(self, name):name.get_word()class Employee:def get_word(self):print("职工")class Teacher(Employee):def get_word(self):print("教师")class Professor(Employee):def get_word(self):print("教授")A = Person()
A.get_word(Employee())
A.get_word(Teacher())
A.get_word(Professor())
运行结果如下:
Python程序开发——第六章 类与对象相关推荐
- Python程序开发——第七章 模块与包
目录 一.模块的定义 二.导入模块.调用模块 (一)import语句 (二)from-import语句 三.标准模块库 (一)sys模块 (二)os模块 (三)random模块 (四)time模块 四 ...
- Python基础篇(六)-- 类和对象
Python语言在设计之初,就定位为一门面向对象的编程语言,而面向对象编程(Object-oriented Programming,简称 OOP),是一种封装代码的方法.比较正式的说法,"把 ...
- Python程序开发——第五章 函数
目录 一.函数的定义 (一)def关键字定义函数 (二)形参和实参 (三)全局变量和局部变量 二.函数的调用 三.函数的参数传递 (一)必需参数 (二)关键字参数 (三)默认参数 (四)不定长参数 1 ...
- Python程序开发——第三章 列表与元组
目录 前言 一.列表 (一)列表的创建 (二)访问列表元素 (三)列表的增删改 (四)列表的遍历 (五)列表的排序 (六)列表的嵌套 二.元组 (一)元组的创建 (二)访问元组元素 (三)元组的连接组 ...
- Python程序开发——第四章 字典与集合
目录 一.字典 (一)字典的创建 (二)字典的访问 (三)字典的增删改查 1.字典的添加 2.字典的删除 3.字典的修改 4.字典的查询 二.集合 (一)集合的分类 (二)集合的创建 (三)集合元素的 ...
- JAVA-初步认识-第六章-类与对象的关系(细节)
一 对象.成员的概念,之前没有讲述过成员,现在讨论一下成员. 描述完事物后,里面就有属性和行为.无论是属性还是行为,都是事物的组成部分.只要是这个事物中的组成部分,我们就把它称之为成员. 成员又分为两 ...
- Python程序开发——第一章 基本python语法
目录 前言 一.PyCharm (一)创建工程文件夹 (二)创建 python 文件并运行 二.IDLE 三.Python中的注释用法 四.变量的命名事项 五.基本输入和输出函数 (一)输入和输出 ( ...
- 【JAVA SE】第六章 面向对象、对象和类以及封装
第六章 面向对象.对象和类以及封装 文章目录 第六章 面向对象.对象和类以及封装 一.面向对象 1.概念 2.面向对象的三大特征 二.对象和类 1.基本概念 2.Java中的对象 3.Java 中的类 ...
- ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性
深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第 ...
最新文章
- 深入理解Ribbon之源码解析
- 涨点小姿势 奥迪TFSI前面数字是什么
- Java 进程间文件锁FileLock详解
- commit是直接提交到远程吗 svn_xcode 把项目代码提交到远程SVN服务器
- 加载慢_解决游戏加载慢不必大刀阔斧升改,教你一个简单有效的方法
- 开发者如何谈判才能获得更高的薪水?
- [HTML] 关于DIV被Flash或表单遮盖的解决方法
- 串口通信----串口接收框接收不到数据
- 第十三届蓝桥杯省赛模拟赛题解(2022年第四次模拟赛)C/C++
- 关于一些常见的矢量格式图(SVG,EPS,wmf,emf)
- etf基金代码大全_再谈深得我心的指数基金:纳指ETF
- oracle nav函数,WordPress函数wp_nav_menu()怎样用_CMS体系建站教程
- 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
- 彻底理解 Window 和 WindowManager
- 【机器学习基础】误差分析
- 【点分治】的学习笔记和众多例题
- ThingsBoard 二次开发之源码分析 5-如何接收 MQTT 连接
- 正交设计 python算法_Python实现正交实验法-高级篇
- python列表是顺序表还是链表_Python 中的 List 是封装了顺序存储结构还是链表存储结构?...
- 业内人士来说一下炫云渲染和渲染100云渲染使用真实感受吧