目录

  • 一、类
    • (一)类、对象
    • (二)类的定义
    • (三)对象的创建和使用
  • 二、限制对象访问
    • (一)定义私有成员、方法
    • (二)访问私有成员、方法
  • 三、构造方法和析构方法
    • (一)构造方法
    • (二)析构方法
  • 四、类方法和静态方法
    • (一)类方法
    • (二)静态方法
  • 五、继承
    • (一)多继承
    • (二)派生类方法重写
    • (三)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程序开发——第六章 类与对象相关推荐

  1. Python程序开发——第七章 模块与包

    目录 一.模块的定义 二.导入模块.调用模块 (一)import语句 (二)from-import语句 三.标准模块库 (一)sys模块 (二)os模块 (三)random模块 (四)time模块 四 ...

  2. Python基础篇(六)-- 类和对象

    Python语言在设计之初,就定位为一门面向对象的编程语言,而面向对象编程(Object-oriented Programming,简称 OOP),是一种封装代码的方法.比较正式的说法,"把 ...

  3. Python程序开发——第五章 函数

    目录 一.函数的定义 (一)def关键字定义函数 (二)形参和实参 (三)全局变量和局部变量 二.函数的调用 三.函数的参数传递 (一)必需参数 (二)关键字参数 (三)默认参数 (四)不定长参数 1 ...

  4. Python程序开发——第三章 列表与元组

    目录 前言 一.列表 (一)列表的创建 (二)访问列表元素 (三)列表的增删改 (四)列表的遍历 (五)列表的排序 (六)列表的嵌套 二.元组 (一)元组的创建 (二)访问元组元素 (三)元组的连接组 ...

  5. Python程序开发——第四章 字典与集合

    目录 一.字典 (一)字典的创建 (二)字典的访问 (三)字典的增删改查 1.字典的添加 2.字典的删除 3.字典的修改 4.字典的查询 二.集合 (一)集合的分类 (二)集合的创建 (三)集合元素的 ...

  6. JAVA-初步认识-第六章-类与对象的关系(细节)

    一 对象.成员的概念,之前没有讲述过成员,现在讨论一下成员. 描述完事物后,里面就有属性和行为.无论是属性还是行为,都是事物的组成部分.只要是这个事物中的组成部分,我们就把它称之为成员. 成员又分为两 ...

  7. Python程序开发——第一章 基本python语法

    目录 前言 一.PyCharm (一)创建工程文件夹 (二)创建 python 文件并运行 二.IDLE 三.Python中的注释用法 四.变量的命名事项 五.基本输入和输出函数 (一)输入和输出 ( ...

  8. 【JAVA SE】第六章 面向对象、对象和类以及封装

    第六章 面向对象.对象和类以及封装 文章目录 第六章 面向对象.对象和类以及封装 一.面向对象 1.概念 2.面向对象的三大特征 二.对象和类 1.基本概念 2.Java中的对象 3.Java 中的类 ...

  9. ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

    深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第 ...

最新文章

  1. 深入理解Ribbon之源码解析
  2. 涨点小姿势 奥迪TFSI前面数字是什么
  3. Java 进程间文件锁FileLock详解
  4. commit是直接提交到远程吗 svn_xcode 把项目代码提交到远程SVN服务器
  5. 加载慢_解决游戏加载慢不必大刀阔斧升改,教你一个简单有效的方法
  6. 开发者如何谈判才能获得更高的薪水?
  7. [HTML] 关于DIV被Flash或表单遮盖的解决方法
  8. 串口通信----串口接收框接收不到数据
  9. 第十三届蓝桥杯省赛模拟赛题解(2022年第四次模拟赛)C/C++
  10. 关于一些常见的矢量格式图(SVG,EPS,wmf,emf)
  11. etf基金代码大全_再谈深得我心的指数基金:纳指ETF
  12. oracle nav函数,WordPress函数wp_nav_menu()怎样用_CMS体系建站教程
  13. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
  14. 彻底理解 Window 和 WindowManager
  15. 【机器学习基础】误差分析
  16. 【点分治】的学习笔记和众多例题
  17. ThingsBoard 二次开发之源码分析 5-如何接收 MQTT 连接
  18. 正交设计 python算法_Python实现正交实验法-高级篇
  19. python列表是顺序表还是链表_Python 中的 List 是封装了顺序存储结构还是链表存储结构?...
  20. 业内人士来说一下炫云渲染和渲染100云渲染使用真实感受吧

热门文章

  1. 后端技术趋势指南|如何选择自己的技术方向
  2. 这里有一份面筋请查收(五)
  3. Spring+Mybatis多数据源配置(二)——databaseIdProvider的使用
  4. 阿里、字节为何都如此偏爱Go语言?
  5. 【视频编解码的新挑战与新机会】
  6. 音视频技术开发周刊 | 208
  7. LiveVideoStackCon深圳-精选最新多媒体技术方案
  8. 零拷贝(Zero Copy)
  9. linux 服务器之查看磁盘使用情况
  10. 开源系统管理资源大合辑