Python3入门与进阶笔记(六):初识类

目录
一些解释
属性
类名建议首字母大写,通常用驼峰规则命名。变量名建议小写,下划线隔开。类最基本的作用是封装。
写在类内非方法中的语句在类加载的时候会执行,且只会执行一次,例如下面的print语句,类加载时就会打印Person类 2。类属性在类加载的时候定义。
class Person(object):sex = 'male' # 类属性money = 2 # 类属性def __init__(self, name, age=None): # 实例方法之构造方法self.name = name # 实例属性self.age = age # 实例属性def run(self): # 实例方法print(self.get_sex())return f"{self.name} 在跑"# 类加载的时候会执行,且只会执行一次print(f"Person类 {money}")@classmethoddef get_sex(cls): # 类方法print(cls.get_money())return f"Person类 {cls.sex}"@staticmethoddef get_money(): # 静态方法return f"Person类staticmethod {Person.money}"if __name__ == "__main__":print("=" * 20)print(Person.get_money())print("=" * 20)print(Person.get_sex())print("=" * 20)alice = Person('alice', 2)print(alice.run())
一些解释
- self
- 定义访问修改实例属性、调用方法,通过self.
- 一般用于实例方法,作为第一个形参,代表当前实例
- 必须传入,在通过实例对象.调用实例方法的时候,python解释器会自动将实例对象传给self,这也就是为啥在实例方法里面可以通过self.访问实例属性、方法,因为其绑定到了当前对象
- cls
- 调用类方法,通过cls.
- 一般用于类方法,作为第一个形参,代表当前类
- 必须传入,在通过类名.调用类方法的时候,python解释器会自动将类传给cls,这也就是为啥在类方法里面可以通过cls.访问实例属性、方法,因为其绑定到了当前类
属性
- 类属性
- 定义于类中个各方法的外部
- 在类加载的时候定义
- 建议通过类名.直接调用和修改,在类方法中,建议通过cls.,虽然类名.也可以,但是不便于维护
- 类属性建议通过cls.、类名.访问修改
- 类属性可以通过self.、实例对象.访问,但是不能通过它修改,因为表面看上去修改了它的值,其实是给当前对象定义(访问、修改)了一个与类属性同名的实例属性,特别的当我们在类的外部通过实例对象.,就会更可怕,因为只有该实例对象拥有了这个与类属性同名的实例属性,其它的实例对象没有该实例属性。
- 实例属性
- 定义在实例方法内部
- 建议定义在__init__构造函数内部,这样我们对类进行实例化的时候,这个实例化对象就会拥有其实例属性,不需要我们显示的调用。若定义在其它实例方法内部,则直到调用那个实例方法该对象才会拥有那些属性
- 因其定义在实例方法内部,所以我们必须通过self.来定义访问修改,不加self.仅是该实例方法的局部变量,而不属于实例属性
方法
实例方法:
- 可访问修改实例属性
- 通常只能访问类属性(self.不能修改类属性,只是创建了同名的实例属性),但是可以通过类名.强制修改类属性
- 通过对象名.调用,在实例方法内可以直接通过self.调用
- 构造方法是特殊的实例方法,__init__(self),自动执行,可以不写return,此时返回类型是None,不能强制返回其他类型
类方法:
- 不可访问实例属性
- 可以访问修改类属性
- 通过类名.调用(也可通过对象名.调用,不推荐),在类方法内可以直接通过cls.调用
静态方法:定义加@staticmethod,不用多传一个形参。可以用类也可以用对象调用静态方法,静态方法也可以访问类变量,和类方法没啥太多区别,在静态方法中不可以访问实例变量。不推荐用静态方法,因为静态方法不是很能体现面向对象的特点。
- 不可访问实例属性
- 可以访问修改类属性(通过类名.)
- 通过类名.调用(也可通过对象名.调用,不推荐)
通过在方法名前加__将方法变为私有的,在外部不可以通过对象名/类名.__方法名访问。python在类外部可以通过对象名.变量名添加实例变量。严格来讲python并没有真正的私有变量,因为可以通过对象名._类名__变量名。
继承
python支持多继承和多重继承。魔法方法类名.__mro__可以查看继承顺序。

例如上图,图上的左右是继承时写在括号中的左右的顺序,继承顺序由先至后如下,这也是继承时不同的父类有同名属性和同名方法的查找路径。
<class '__main__.E'>, <class '__main__.D1'>, <class '__main__.C1'>, <class '__main__.C2'>, <class '__main__.B1'>, <class '__main__.A1'>, <class '__main__.A2'>, <class 'object'>

<class '__main__.E'>, <class '__main__.A3'>, <class '__main__.C2'>, <class '__main__.D1'>, <class '__main__.C1'>, <class '__main__.B1'>, <class '__main__.A1'>, <class '__main__.A2'>, <class 'object'>
<class '__main__.E'>, <class '__main__.D1'>, <class '__main__.C1'>, <class '__main__.B1'>, <class '__main__.A1'>, <class '__main__.B2'>, <class '__main__.C2'>, <class '__main__.B3'>, <class '__main__.A2'>, <class 'object'>
我们可以看到大致路径是这样的,先从最左边的父类一步一步往上找(每次也只找最左侧的父类)类似于深度搜索;若是发现该父类还有其它子类,则我们回过头去走那些没有走过的路(例如到了A2,发现还可以从E->D1->C2->B3,其中只有C2->B3未遍历,所以加进去)
相关文章:
Python3入门与进阶笔记(六):初识类
目录 一些解释 属性 类名建议首字母大写,通常用驼峰规则命名。变量名建议小写,下划线隔开。类最基本的作用是封装。 写在类内非方法中的语句在类加载的时候会执行,且只会执行一次,例如下面的print语句,类加载时就会…...
Prometheus监控实战系列九:主机监控
Prometheus使用各种Exporter来监控资源。Exporter可以看成是监控的agent端,它负责收集对应资源的指标,并提供接口给到Prometheus读取。不同资源的监控对应不同的Exporter,如node-exporeter、mysql-exporter、kafka-exporter等,在这…...
JVM知识整理
JVM知识整理 JVM的主要组成部分 JVM包含两个两个子系统(类加载子系统和执行引擎)和两个组件(运行时数据区与和本地库接口) 类加载子系统:根据给定的全限定类名来加载class文件到运行时数据区域中的方法区。执行引擎&a…...
【C++】二叉搜索树
A:你长大后想要做什么? B:写下“快乐”…… A:不,你理解错我的意思了,我是说 B:不,是你理解错了人生…… 文章目录一、二叉搜索树的实现1.struct TreeNode{}2.迭代版本2.1 Insert()插入结点(解决链接的问题)…...
leetcode -- 21. 合并两个有序链表
🐨目录📑1. 题目🛶2. 解法- 头插到新链表🐬2.1 思路🐬2.1 代码实现⛵3. 解法优化 - 带哨兵位🐋3.1 思路🐋3.2 代码实现🚤4. 题目链接📑1. 题目 将两个升序链表合并为一个…...
计算机组成原理|第四章(笔记)
目录第四章 存储器4.1 概述4.1.1 存储器分类4.1.2 存储器的层次结构4.2 主存储器4.2.1 概述4.2.2 半导体存储芯片简介4.2.3 随机存取存储器(RAM)4.2.4 只读存储器(ROM)4.2.5 存储器与CPU的连接4.2.6 存储器的校验4.2.7 提高访存速…...
【Unity3D-BUG记录】Unity3D中出现“动画片段必须标记为Legacy的警告”消除方法
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中可能会遇到下面的警告: The AnimationClip…...
Spring Bean的定义(含创建Bean的三种方式)
🏆 文章目标:复习和理解下Spring Bean的定义 🍀 Spring Bean的定义(含创建Bean的三种方式) ✅ 创作者:Jay… 🎉 个人主页:Jay的个人主页 🍁 展望:若本篇讲解内…...
vue的路由-vue router(一)
vue的路由-vue router一、路由的基本使用HTMLrouter-linkrouter-viewJavaScript二、带参数的动态路由匹配三、嵌套路由四. 编程式导航导航到不同的位置替换当前位置横跨历史篡改历史五. 命名路由六. 命名视图嵌套命名视图七. 重定向和别名重定向别名八. 将 props 传递给路由组件…...
DevOps流水线搭建-PHP版本
一、介绍流水线发布代码1、官网https://www.jenkins.io/zh2、kubesphere里的介绍https://kubesphere.io/zh/docs/v3.3/devops-user-guide/how-to-use/pipelines/choose-jenkins-agent/3、git仓库可以自己写点测试代码,提交,待会测试用https://gitee.com/…...
C语言之按位取反~(七十一)
计算机存储数据基本知识计算机中二进制数包括(正数和负数)是以补码形式存储。符号位:补码的最左侧首位是符号位,0表示正数,1表示负数。二进制有三种形式:原码、反码、补码。正数的补码和反码:是…...
C# 委托
Action 在 C# 中,Action 是一个预定义的委托类型,表示一个不带参数和返回值的方法。它的定义如下: public delegate void Action();Action 委托可以用于表示任何没有参数和返回值的方法。例如: // 定义一个不带参数和返回值的方…...
leetcode究极刷题笔记(11~15)
(11)盛最多水的容器(中等) 实现思路: 定义两个指针(a,b),分别指向数组的前后位置,如果此时a的值小于b的话,就将a右移一位,如果此时b指向的值小于…...
【C语言】一篇带你从零了解 枚举
文章目录什么是枚举枚举类型的定义枚举的优点枚举的使用什么是枚举 枚举是 C 语言中的一种基本数据类型 可以让数据更简洁,更易读。 枚举顾名思义就是 一 一 列举。 把可能的取值 一 一列举。 比如我们现实生活中: 一周的星期一到星期日是有限的7天&…...
用Pytorch搭建一个房价预测模型
本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 目录 一、项目介绍 二、准备工作 三、实验过程 3.1数据预处理 3.2拆分数据集 3.3构建PyTorch模型 3.3.1.数据转换 3.3.2定义模型架构 3.3.3定义损失准则和优化器 3.3.4创建…...
《Netty》从零开始学netty源码(十五)之ServerSocketChannel
在NioServerSocketChannel中调用newChannel方法创建java原生的channel,过程如下: ServerSocketChannel是一个抽象类,WEPollSelectorProvider调用openServerSocketChannel方法创建的是它的实现类ServerSocketChannelImpl,类结构如下…...
Java stream性能比较
环境 Ubuntu 22.04IntelliJ IDEA 2022.1.3JDK 17CPU:8核 ➜ ~ cat /proc/cpuinfo | egrep -ie physical id|cpu cores physical id : 0 cpu cores : 1 physical id : 2 cpu cores : 1 physical id : 4 cpu cores : 1 physical id : 6 cpu cores : 1 physical id …...
【数据结构与算法】设计循环队列
文章目录👑前言如何设计循环队列设计循环队列整体的代码📯写在最后👑前言 🚩前面我们 用队列实现了一个栈 ,用栈实现了一个队列 ,相信大家随随便便轻松拿捏,而本章将带大家上点难度,…...
最新版!国内IT软件外包公司汇总~
金三银四已经过去一半,再过几个月又将迎来毕业季,大家有没有找到心仪的工作机会呀?有很多同学说今年的金三银四似乎不存在了。小李:今年的金三银四变成了铜三铁四,不断地投递又不断地造拒。小王:大量已读不…...
MySQL的COUNT语句,竟然都能被面试官虐的这么惨!?
关于数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT 但是,就是这个常用的COUNT函数,却暗藏着很多玄机,尤其是在面试的时候,一不小心就会被虐。不信的话请尝试回答下…...
终极指南:3分钟搞定Windows iPhone网络共享驱动一键安装
终极指南:3分钟搞定Windows iPhone网络共享驱动一键安装 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_m…...
华为交换机Telnet配置保姆级教程:从无认证到AAA认证,手把手带你避坑
华为交换机Telnet安全配置全指南:从基础到企业级实践 远程管理网络设备是每位网络工程师的必备技能,而Telnet作为最传统的远程登录协议之一,至今仍在许多企业环境中广泛使用。记得我刚入行时,第一次通过Telnet成功登录到一台核心交…...
别再死磕SAR ADC了!聊聊那些被低估的‘算法ADC’与‘流水线ADC’实战选型心得
算法ADC与流水线ADC实战选型指南:突破SAR ADC的思维定式 在嵌入式系统与传感器信号链设计中,模数转换器(ADC)的选择往往直接决定整个系统的性能天花板。当工程师们面对"高精度低速"、"中速中精度"和"高速高动态范围"等不同…...
<el-button type=“primary“><el-icon><Plus /></el-icon> 上传照片</el-button>的庖丁解牛
它的本质是:**这行代码不仅仅是一个按钮,它是一个 复合交互单元 (Composite Interaction Unit)。它通过 语义化标签 (el-button)、视觉信号 (type"primary", Plus Icon) 和 文本提示 (“上传照片”) 的组合,向用户传达了一个明确的…...
C++类型推导与auto关键字
C类型推导与auto关键字 类型推导是C11引入的重要特性,通过auto和decltype关键字,编译器可以自动推导变量的类型,减少代码冗余并提高可维护性。 auto关键字让编译器根据初始化表达式推导变量类型。 #include #include #include #include v…...
生成式AI绘画的版权困局与人机协同新范式
1. 这不是技术升级,而是一场创作权的重新分配“Paint, Pixels, and Plagiarism”——光看这个标题,你就能闻到火药味。它没在讲AI怎么画得更像梵高,也没教你怎么用Stable Diffusion生成赛博朋克海报;它直指一个所有画师、设计师、…...
Java应用CPU飙升到900%?这套排查套路让你10分钟定位根因
在这篇文章中,我将结合最近一次真实的生产事故,分享一套经过实战检验的CPU排查方法论。这不是教科书上那些”用jstack查看线程栈”的泛泛之谈,而是我们在72小时连续作战中总结出来的血泪经验。 一、告警响应该做什么?别急着重启&…...
企业级应用如何利用 Taotoken 实现多模型智能路由与成本控制
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 企业级应用如何利用 Taotoken 实现多模型智能路由与成本控制 对于需要稳定、高效调用大模型的企业开发团队而言,直接对…...
Photoshop到URP的法线验证闭环:跨引擎法线贴图精准调试指南
1. 这不是个“一键生成法线”的玩具,而是一套跨引擎、跨工作流的材质验证闭环你有没有遇到过这样的情况:在 Photoshop 里辛苦调出一张完美的 Normal Map,导入 Unity 后却发现高光方向反了、边缘发灰、贴图在 Decal 上拉伸变形,甚至…...
可观测性告警:及时发现和响应系统异常
可观测性告警:及时发现和响应系统异常 一、可观测性告警概述 1.1 可观测性告警的定义 可观测性告警是指基于系统的指标、日志和追踪数据,通过预设的规则和阈值,自动检测系统异常并发送通知的机制。它帮助运维人员及时发现问题,快速…...
