Python Class 类详解:定义、继承与特殊方法的使用

Python Class 类详解:定义、继承与特殊方法的使用

文章目录

  • Python Class 类详解:定义、继承与特殊方法的使用
      • 一 定义类 class
      • 二 class 的功能
      • 三 继承
        • 1 未有继承之前
        • 2 有继承之后
      • 四 私有属性和功能
      • 五 特殊方法
      • 六 完整文件示例
      • 七 源码地址

本文深入介绍了 Python 中类的定义与使用方法,涵盖了类的基本概念、实例化、继承以及私有属性的应用。文章通过实例展示了如何将属性和方法封装在类中,并通过 __init__ 方法初始化类的实例。还探讨了类的继承机制,展示了如何通过继承减少重复代码。除此之外,文中讨论了私有变量与方法的使用场景,以及特殊方法如 __add____sub__ 等的重载,实现了运算符的自定义功能。本文为你提供了一个完整的类使用指南,帮助你在 Python 中高效地组织和管理代码。

一 定义类 class

类的写法首字母大写。

class File:# __init__() 在类实例化时触发一次 __init__ 功能,它可以用来初始化配置def __init__(self):# self 获取这个类的自己的属性或功能时使用它self.name = "f1"self.create_time = "today"

init() 在类实例化时触发一次 init 功能,它可以用来初始化配置;self 获取这个类的自己的属性或功能时使用它。

二 class 的功能

把一类相同事物的函数方法封装到一起。

# 类似 Function 函数功能 可以给 __init__() 加上入参,在初始化时传入参数
class File01:def __init__(self, name, create_time="today"):self.name = nameself.create_time = create_time# 一个类中可以定义多个方法def change_name(self, new_name):# 修改这个类中的属性,使用 self 调用 name 并修改属性self.name = new_name# 定义一个有返回的函数,在类中定义函数 需要加上 selfdef get_info(self):return self.name + " is created at " + self.create_time

一个类中可以定义多个方法,定义一个有返回的函数,在类中定义 Function 函数 需要加上 self。

三 继承

1 未有继承之前
class Video:def __init__(self, name, window_size=(1080, 720)):self.name = nameself.window_size = window_sizeself.create_time = "today"class Text:def __init__(self, name, language="zh-cn"):self.name = nameself.language = languageself.create_time = "today"

Video 和 Text 中有共同的属性,是不是可以减少共有属性/功能的重复开发,是可以的,使用继承

2 有继承之后
# 继承示例
class File02:def __init__(self, name, create_time="today"):self.name = nameself.create_time = create_timedef get_info(self):return self.name + "is created at" + self.create_timeclass Video02(File02):  # 继承了 File 的属性和功能def __init__(self, name, window_size=(1080, 720)):# 将共用属性的设置导入 File 父类super().__init__(name=name, create_time="today")self.window_size = window_sizeclass Text02(File02):  # 继承了 File 的属性和功能def __init__(self, name, language="zh-cn"):# 将共用属性的设置导入 File 父类super().__init__(name=name, create_time="today")self.language = language# 也可以在子类里复用父类功能def get_more_info(self):return self.get_info() + ", using language of " + self.language

这里继承的是类 File02。

四 私有属性和功能

class File03:def __init__(self):self.name = "f1"self.__deleted = False  # 我不让别人用这个变量self._type = "txt"  # 我不想别人使用这个变量def delete(self):self.__force_delete()# 私用变量无法访问,只能内部访问def __force_delete(self):  # 我不让别人使用这个功能self.__deleted = Truereturn True# 不建议直接访问def _soft_delete(self):  # 我不想让别人使用这个功能return self.__force_delete()  # 我自己可以在内部随便调用# 可以这样访问def delete_self(self):return self._soft_delete()

私有属性的特点

私有特点
_ 一个下划线开头弱隐藏 不想让别人用 (别人在必要情况下还是可以用的)
__ 两个下划线开头强隐藏 不让别人用

注意:

1)”_“ 是私有的,一般不应该被调用
2)”__“ 是为了避免子类重写某个函数而使用的
3)”__xx__“ 一般是用于Python调用

五 特殊方法

特殊方法,__xx__前后双下划线,这种方法被称为魔术方法,一般是系统定义名字,类似于__init__(),它是给Python调用的。

定义含义
def __init__()初始化实例
def __repr__()字符串的“官方”表现形式
def __str__()字符串的“非正式”值
def __iter__()遍历某个序列
def __next__()从迭代器中获取下一个值

示例

class WrongMethod(object):def __init__(self, n):self.n = n# 重载加法运算符 (__add__ 方法) 它不执行标准的 Python 加法def __add__(self, other):return self.n - other# 重载减法运算符 (__sub__ 方法) 它不执行标准的 Python 减法def __sub__(self, other):return self.n + otherdef __str__(self):return str(self.n)

六 完整文件示例

# This is a sample Python script.# Press ⌃R to execute it or replace it with your code.
# Press Double ⇧ to search everywhere for classes, files, tool windows, actions, and settings.def print_hi(name):# Use a breakpoint in the code line below to debug your script.print(f'Hi, {name}')  # Press ⌘F8 to toggle the breakpoint.# 定义 class
class File:# __init__() 在类实例化时触发一次 __init__ 功能,它可以用来初始化配置def __init__(self):# self 获取这个类的自己的属性或功能时使用它self.name = "f1"self.create_time = "today"# class 的功能
# 类似函数功能 可以给 __init__() 加上入参,在初始化时传入参数
class File01:def __init__(self, name, create_time="today"):self.name = nameself.create_time = create_time# 一个类中可以定义多个方法def change_name(self, new_name):# 修改这个类中的属性,使用 self 调用 name 并修改属性self.name = new_name# 定义一个有返回的函数,在类中定义函数 需要加上 selfdef get_info(self):return self.name + " is created at " + self.create_time# 继承
class Video:def __init__(self, name, window_size=(1080, 720)):self.name = nameself.window_size = window_sizeself.create_time = "today"class Text:def __init__(self, name, language="zh-cn"):self.name = nameself.language = languageself.create_time = "today"# Video 和 Text 中有共同的属性,是不是可以减少共有属性/功能的重复开发——继承# 继承示例
class File02:def __init__(self, name, create_time="today"):self.name = nameself.create_time = create_timedef get_info(self):return self.name + "is created at" + self.create_timeclass Video02(File02):  # 继承了 File 的属性和功能def __init__(self, name, window_size=(1080, 720)):# 将共用属性的设置导入 File 父类super().__init__(name=name, create_time="today")self.window_size = window_sizeclass Text02(File02):  # 继承了 File 的属性和功能def __init__(self, name, language="zh-cn"):# 将共用属性的设置导入 File 父类super().__init__(name=name, create_time="today")self.language = language# 也可以在子类里复用父类功能def get_more_info(self):return self.get_info() + ", using language of " + self.language# 私有属性和功能
class File03:def __init__(self):self.name = "f1"self.__deleted = False  # 我不让别人用这个变量self._type = "txt"  # 我不想别人使用这个变量def delete(self):self.__force_delete()# 私用变量无法访问,只能内部访问def __force_delete(self):  # 我不让别人使用这个功能self.__deleted = Truereturn True# 不建议直接访问def _soft_delete(self):  # 我不想让别人使用这个功能return self.__force_delete()  # 我自己可以在内部随便调用# 可以这样访问def delete_self(self):return self._soft_delete()# 私有	特点# _ 一个下划线开头	弱隐藏 不想让别人用 (别人在必要情况下还是可以用的)# __ 两个下划线开头	强隐藏 不让别人用# 特殊方法,"__xx__" 前后双下划线,这种方法被称为魔术方法,一般是系统定义名字,类似于__init__(),一般是给Python调用的。# 定义	含义# def __init__()	初始化实例# def __repr__()	字符串的“官方”表现形式# def __str__()	字符串的“非正式”值# def __iter__()	遍历某个序列# def __next__()	从迭代器中获取下一个值# ”_“ 是私有的,一般不应该被调用# ”__“ 是为了避免子类重写某个函数而使用的# ”__xx__“ 一般是用于Python调用class WrongMethod(object):def __init__(self, n):self.n = n# 重载加法运算符 (__add__ 方法) 它不执行标准的 Python 加法def __add__(self, other):return self.n - other# 重载减法运算符 (__sub__ 方法) 它不执行标准的 Python 减法def __sub__(self, other):return self.n + otherdef __str__(self):return str(self.n)# Press the green button in the gutter to run the script.
if __name__ == '__main__':print_hi('Class 类')# See PyCharm help at https://www.jetbrains.com/help/pycharm/# 类的实例化和调用my_file = File()print(my_file.name)print(my_file.create_time)print()# 修改类的属性my_file.name = "new_name"print(my_file.name)print()# 在初始化时传入参数my_file01 = File01("my_file01")print(my_file01.name)print(my_file01.create_time)# 函数无参数返回时,会打印 Noneprint(my_file01.change_name("new_name"))print(my_file01.name)print()print(my_file01.get_info())print()v02 = Video02("my_video")t02 = Text02("my_text")print(v02.get_info())  # 调用父类的功能print(t02.create_time)  # 调用父类的属性print(t02.language)  # 调用自己的属性print(t02.get_more_info())  # 调用自己加工父类的功能print()f03 = File03()print(f03._type)  # 可以拿到值,但是这个类的作者不想让你直接这样拿到print(f03._soft_delete())  # 可以调用,但是这个类的作者不想让你直接调用print(f03.delete_self())# 接下来的两个实验都会报错#  f03.__force_delete()num = WrongMethod(20)print("num = ", num)# 这里返回的答案时错误的,是重载之后重新定义的方法print("num + 10 = ", num + 10)# 这里返回的答案时错误的,是重载之后重新定义的方法print("num - 10 = ", num - 10)# - 在`__add__`方法中,实际执行的是减法操作。# - 在`__sub__`方法中,实际执行的是加法操作。# 这种实现虽然在功能上是有效的,但可能会引起阅读和使用代码的人的困惑,因为它违背了常规的期望和实践。通常,我们期望# `__add__`和`__sub__`分别实现标准的加法和减法行为。

复制粘贴并覆盖到你的 main.py 中运行,运行结果如下。

Hi, Class 类
f1
todaynew_namemy_file01
today
None
new_namenew_name is created at todaymy_videois created attoday
today
zh-cn
my_textis created attoday, using language of zh-cntxt
True
True
num =  20
num + 10 =  10
num - 10 =  30

七 源码地址

代码地址:

国内看 Gitee 之 Class 类.py

国外看 GitHub 之 Class 类.py

引用 莫烦 Python

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1539901.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

204页PPT金税四期监管要求与最新政策及风险防范-培训课件

读者朋友大家好,最近有会员朋友咨询晓雯,需要《204页PPT金税四期监管要求与最新政策及风险防范-培训课件(经典》资料,欢迎大家下载学习。 金税四期稽查的重点包括以下方面: 企业发票:关注资金流、发票流、…

前后端独立部署的企业级私有化文档管理系统丨无忧·企业文档

大家好,我是软件部长,今天给大家介绍一款企业级在线知识库项目-JVS的无忧企业文档。 JVS提供低代码、物联网、规则引擎、智能BI、逻辑引擎、无忧企业文档(在线协同)、无忧企业计划、无忧企业邮筒等平台,欢迎关注微信公…

vscode连接不上远程服务器

删除缓存.vscode 然后再删除.ssh

Vue3快熟

Vue3快速上手 1. Vue3简介1.1. 【性能的提升】1.2.【 源码的升级】1.3. 【拥抱TypeScript】1.4. 【新的特性】 2. 创建Vue3工程2.1. 【基于 vue-cli 创建】2.2. 【基于 vite 创建】(推荐)2.3. 【一个简单的效果】 3. Vue3核心语法3.1. 【OptionsAPI 与 CompositionAPI】Options…

【C语言】常见的C语言概念

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 什么是C语言2.C语言的历史3. 编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022的优缺点 4.VS项目和源文件、头文件介绍5. 第一个C语言程序6. main函数7. printf和库函数8. 关键字介绍9. 字符和ASCII编…

react hooks--useReducer

概述 很多人看到useReducer的第一反应应该是redux的某个替代品,其实并不是 ◼ useReducer仅仅是useState的一种替代方案:  在某些场景下,如果state的处理逻辑比较复杂,我们可以通过useReducer来对其进行拆分; 或…

gma 2.0.13 (2024.09.16) 更新日志

安装 gma 2.0.13 pip install gma2.0.13网盘下载: 链接:https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码:1pc8 注意:此版本没有Linux版! 编译gma的Linux虚拟机没有时间修复,本期Linux版…

Angular17+leaflet集成天地图组件

Angular17leaflet集成天地图组件 例图 需要的包 "asymmetrik/ngx-leaflet": "^17.0.0","types/leaflet": "^1.9.12","leaflet": "^1.9.4",去天地图网站获取一个token https://www.tianditu.gov.cn/ 创建Angul…

8、创建一般资产负债科目

定义解释 在前台创建资产负债类科目。定义资产负债类会计科目。 在 SAP 中,会计科目的定义分为两层:科目表层和公司代码层。 比如:一个集团企业可以定义一套会计科目表,但是下面的每个公司代码,从中选择哪些科目,这…

透明LED模块的应用场景

随着科技的不断进步和市场需求的增长,透明LED显示屏的应用越来越广泛,成为了众多领域中的创新亮点。透明LED模块凭借其高通透率、轻薄设计以及与环境的完美融合,正逐步替代传统显示方式,为现代化的展示和广告提供了全新的解决方案…

PicoQuant公司:探索铜铟镓硒(CIGS)太阳能电池技术,引领绿色能源革新

铜铟镓硒(‌CIGS)‌薄膜太阳能电池具有生产成本低、污染小、不衰退、弱光性能好等显著特点,光电转换效率居各种薄膜太阳电池之首,接近于晶体硅太阳电池,而成本只是它的三分之一,被称为下一代非常有前途的新…

window批处理脚本:将本地的三个文件通过SCP传输到Linux设备上

文件名send_file.bat: echo off setlocal:: 提示用户输入远程IP地址 set /p remoteIpAddressplease input IP::: 定义本地文件名 set "localFile1111" set "localFile2222" set "localFile3333":: 获取本地文件的完整路径 set "…

项目与产品的生命周期

在项目管理领域有两个关键概念,即项目生命周期和产品生命周期。它们是理解项目管理过程中的关键要素。 项目生命周期是一个项目从概念到完成所经过的所有阶段。所有项目都可分成若干阶段,且所有项目无论大小,都有一个类似的生命周期结构。阶…

学习大数据DAY59 全量抽取和增量抽取实战

目录 需求流程: 需求分析与规范 作业 作业2 需求流程: 全量抽取 增量抽取 - DataX Kettle Sqoop ... 场景: 业务部门同事或者甲方的工作人员给我们的部门经理和你提出了新的需 求 流程: 联系 > 开会讨论 > 确认需求 > 落地 需求文档( 具体…

day-56 整数转罗马数字

思路 因为题目已经告知num<3999&#xff0c;所以只需依次对1000,900,500,400,100,90,50,40,10,9,5,4,1这些数进行除法&#xff0c;判断商是否大于等于1&#xff0c;如果大于等于1则将对应的罗马数字拼接到字符串中即可 解题过程 为了方便拼接&#xff0c;可以使用哈希键值对…

关于用matplotlib.pyplot加载图片颜色不对的解决方法

1.原理&#xff1a;用opencv加载的图片是BGR存储的。而用matplotlib.pyplot 需要RGB的格式,故在加载之前使用下面的语句改成RGB格式。 img2 cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 或使用 # img2 img[:, :, ::-1]#将图像img的颜色通道进行反转。 ::-1 表示在最后一个维度…

【吊打面试官系列-MySQL面试题】LIKE 声明中的%和_是什么意思?

大家好&#xff0c;我是锋哥。今天分享关于【LIKE 声明中的&#xff05;和_是什么意思&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; LIKE 声明中的&#xff05;和_是什么意思&#xff1f; &#xff05;对应于 0 个或更多字符&#xff0c;_只是 LIKE 语句中的…

图纸管理系统到底是什么?适合哪些企业去部署?

图纸管理系统作为现代企业数字化转型的基石&#xff0c;正逐步成为各行各业不可或缺的重要工具。它不仅革新了传统图纸的存储与管理方式&#xff0c;更通过集成化、智能化的功能&#xff0c;为企业带来了前所未有的工作效率与数据安全保障。无论是建筑设计、制造业还是航空航天…

Prometheus架构详解

1 Prometheus简介 Prometheus 是一个开源的系统监控报警工具套件&#xff0c;它最初由SoundCloud开发&#xff0c;并于2016年成为CNCF&#xff08;云原生计算基金会&#xff09;托管的第二个项目&#xff08;第一个是kubernetes&#xff09;。Prometheus 以其简单高效的方式收…

华为云服务综合实验

一、实验需求 本次实验内容基于华为云平台模拟企业web集群的构建&#xff0c;其中涉及的知识点包括Linux系统知识、nginx服务的安装及配置应用、云数据库 RDS(Relational Database Service,简称RDS)、虚拟私有云vpc、安全组、SFS弹性文件服务器以及负载均衡等。要求学生通过本…