当前位置: 首页 > news >正文

Python面向对象详解

文章目录

    • 类和继承
    • 变量保护
    • 类装饰器

类和继承

Python虽然以函数式著称,但在Python中,万物皆对象,其对面向对象编程是有着非常不错的支持的。类是面向对象的核心数据类型,下面代码就创建了一个Person类。

class Person:count = 0def __init__(self, name, ID):self.name = nameself.ID = IDPerson.count += 1def introduce(self):print(f"I'm {self.name}")def peopleCount(self):print(f"There are {Person.count} persons")p1 = Person("micro", 1)
p2 = Person("cold", 2)
p1.introduce()      # I'm micro
p1.peopleCount()    # There are 2 persons

其中,__init__函数用于类的初始化,参数self表示当前对象。所以创建p1和p2时,两人分别被赋予了不同的姓名和编号,并可通过introduce方法进行调用。

写在类内部、函数外部的变量属于整个类的共有变量,所以每当创建一个新的对象时,count都会加一。所以,无论p1还是p2在调用peopleCount函数时,均回得到共有两人的结果。当然,随着创建对象的增多,这个值也会随之增长。

在一个类中,一般变量被称作成员变量,函数被称作成员函数,也可称为方法。

如果只用一个关键词来形容面向对象,那么这个关键词一定是继承,不能继承的类将和结构体没什么区别。下面是一个继承了【Person】的类。

class Student(Person):def __init__(self, name, ID, grade):super(Student, self).__init__(name, ID)self.grade = gradedef introduce(self):print(f"I'm {self.name}", end=', ')self.getGrade()def getGrade(self):print(f"my grade is {self.grade}")p3.introduce()      # I'm soft, my grade is 4
p3.peopleCount()    # There are 3 persons

在类的继承过程中,如果想连带着继承类的某个方法,那么就可以直接将这个方法省略,比如peopleCount,便直接沿用了Person类中的内容。

相应地,如果重新写了这个函数,那么这个函数就会焕然一新,而与父类的同名方法变得毫无关联,这个过程叫做方法重写。introduce就是这种情况,虽然与Person类有着相同的名字,但输出结果发生了变化。

初始化函数也是一样,如果省略,就会沿用父类的做法;如果重写,就会变得与父类无关。super函数为子类和父类的函数之间架设了一道桥梁,super(Student, self)即可找到Student的父类,并调用其中的函数。所以Student类尽管重写了初始化方法,但也沿用了父类的一些处理,从而节约了代码。

变量保护

在Python中,出于于某些考虑,会对属性加以保护,不得随意访问。比如一个人的年龄,大小倒是无所谓了,但必须得是个数值,如果完全暴露出去,那被人改成字符串麻烦可就大了。

为此,在Python中,如果某个成员以双下划线开头,那么这就是无法被访问的,从而使得变量得以保护。

但另一方面,又不得不围绕这个属性创建一系列方法,最起码就得包括设置和读取的功能,为了让这些功能更易于调用,Python提供了property函数,示例如下

class Private(Person):def set_age(self, age):if type(age)==int:self.__age = agedef get_age(self):return self.__agedef del_age(self):del self.__ageage = property(get_age, set_age, '年龄')p3 = Private("c", 3)
p3.age = 18
print(p3.age)   # 18
p3.__age
'''直接调用会报错
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute '__age'
'''
p3.age = "20"
print(p3.get_age())
print(p3.age)   # 18

其中,_age是一个私有变量,受到保护,无法访问。而age则可以赋值和调用值。但是,当把age的值设为字符串时,并没有响应,可见当赋值的时候,的确是调用了set_age方法。

property提供了装饰器的语法糖,从而上述功能可以写成形如下式的更加简洁的形式,并且添加了删除属性的功能。

class Private(Person):@propertydef age(self):return self.__age@age.setterdef age(self, age):if type(age)==int:self.__age = age@age.deleterdef age(self):del self.__age

在编程时,类内部的很多东西并不想被外界得到,即需要一种访问限制的方法,以避免下列情况的发生

p3.count -= 5
print(p3.count)   # -2

类装饰器

一般来说,在Python类中不加修饰的方法叫做实例方法,即只有经过经过实例化之后,才能调用。但也存在另一种需求,即不创建类的对象,而直接调用类的方法。比如想通过类的方法进行初始化,或者干脆只是把类当作一个函数库。

为此,可以使用类方法和静态方法,这两种方法可直接通过类的名字进行调用。区别在于,类方法会将类自身作为第一个参数传入,而静态方法则完全就是一个函数,某种意义上来讲,似乎和这个类并无关联,示例如下。

class Person:count = 0def __init__(self, name, ID):self.name = nameself.ID = IDPerson.count += 1def introduce(self):print(f"I'm {self.name}")@classmethoddef peopleCount(cls):print(f"There are {cls.count} persons")@classmethoddef alphaMan(cls, name, ID):cls.count -= 1return Person(name, ID)@staticmethoddef add(a,b):return a+b

其中,introduce是实例方法,无需多言。

【classmethod】是类方法的装饰器,上面代码中,peopleCount和alphaMan都是类方法,其第一个参数cls指代的就是Person自身。

【staticmethod】是静态方法修饰器,add方法即为静态方法,可见这个方法的目的是求和,从代码结构来看,实在看不到与Person的半点关联。

示例如下,可见静态方法和类方法均可不经实例化而调用,且前者与普通的函数没什么区别。当调用构造函数创建对象时,count会增加;而创建一个透明人,由于代码中剪掉了一个计数,所以count并不会增加。

Person.add(3,4)         # 7
Person.peopleCount()    # There are 0 persons
p1 = Person("a", 1)
Person.peopleCount()    # There are 1 persons
p2 = Person.alphaMan("b", 2)
Person.peopleCount()    # There are 1 persons

相关文章:

Python面向对象详解

文章目录 类和继承变量保护类装饰器 类和继承 Python虽然以函数式著称&#xff0c;但在Python中&#xff0c;万物皆对象&#xff0c;其对面向对象编程是有着非常不错的支持的。类是面向对象的核心数据类型&#xff0c;下面代码就创建了一个Person类。 class Person:count 0d…...

思维题锻炼-最小数字

思维题锻炼-最小数字 目录题目描述输入样例输出样例代码 目录 题目描述 给一串数字&#xff0c;求出最小的整数&#xff0c;不能是原数字串中的数字&#xff0c;也不能由数字串中的数字相加得到 输入样例 5 2 1输出样例 4代码 #include<bits/stdc.h> #include<s…...

ubuntu20.04 运行 lio-sam 流程记录

ubuntu20.04 运行 lio-sam 一、安装和编译1.1、安装 ROS11.2、安装 gtsam1.3、安装依赖1.4、下载源码1.5、修改文件1.6、编译和运行 二、官方数据集的运行2.1、casual_walk_2.bag2.2、outdoor.bag、west.bag2.3、park.bag 三、一些比较好的参考链接 记录流程&#xff0c;方便自…...

P5356 [Ynoi2017] 由乃打扑克

我手把手教她打扑克 qwq 综合分析一下2个操作&#xff0c;查找区间第k小的值&#xff0c;感觉可以用主席树&#xff0c;区间修改那没事了 考虑分块做法,块长B 分析第一个操作 只需要维护数列的单调性&#xff0c;然后二分答案上二分就ok了 分析第二个操作 维护一个加法懒…...

随机潮流应对不确定性?计及分布式发电的配电系统随机潮流计算程序代码!

前言 随着分布式电源在电力系统中所占比例的不断扩大,研究分布式发电对系统稳态运行的影响势在必行。带分布式发电的潮流计算常常用来评估其并网后对系统的影响&#xff0c;同时它也是分析分布式发电对电网稳定性的影响等其他理论研究工作的基础。然而&#xff0c;许多分布式发…...

Oracle表空间满清理方案汇总分享

目录 前言思考 一、第一种增加表空间的数据文件数量达到总容量的提升 二、第二种解决方案针对system和sysaux的操作 2.1SYSTEM表空间优化 2.2sysaux表空间回收 2.2.1针对sysaux的表空间爆满还有第二套方案维护 三、第三种解决方案使用alter tablespace resize更改表空间的…...

基于单片机数码管20V电压表仿真设计

**单片机设计介绍&#xff0c;基于单片机数码管20V电压表仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机数码管20V电压表仿真设计的主要目的是通过单片机和数码管显示电路实现一个能够测量0到20V直流电压的电…...

SCI一区 | Matlab实现NGO-TCN-BiGRU-Attention北方苍鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现NGO-TCN-BiGRU-Attention北方苍鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现NGO-TCN-BiGRU-Attention北方苍鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型…...

C++——优先级队列

前言&#xff1a;这篇文章我们继续来分享一个c的容器——优先级队列。 一.理解优先级 何为优先级一说&#xff1f;实际上就是有顺序的意思。 优先级队列&#xff0c;即有顺序的队列&#xff0c;是一个无需我们自己进行排序操作&#xff0c;在数据传入时就会由容器自己排好序的…...

docker部署jumpserver

1、安装Docker以及相关依赖 配置yum源 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin2、添加国…...

ARM FVP平台的terminal窗口大小如何设置

当启动ARM FVP平台时&#xff0c;terminal窗口太小怎么办&#xff1f;看起来非常累眼睛&#xff0c;本博客来解决这个问题。 首先看下ARM FVP平台对Host主机的需求&#xff1a; 通过上图可知&#xff0c;UART默认使用的是xterm。因此&#xff0c;我们需要修改xterm的默认字体设…...

003 静态代理

文章目录 StudentServiceImplStudentService.javaStudentServiceProxy.javaStudentServiceProxy1.javaStudentServiceProxyTest.java StudentServiceImpl package com.aistart.service.impl;import com.aistart.mapper.StudentMapper; import com.aistart.pojo.Student; import…...

基于JAX的二阶优化方法的实践

使用协作分支上的算法 git clone https://github.com/linjing-lab/jax.git cd jax git checkout linjing-lab cd examples在命令行预览方法 牛顿方法&#xff1a; cat newton_method.py拟牛顿法&#xff1a; cat bfgs_method.py在命令行运行程序 python newton_method.pyp…...

【计算机考研】408算法大题怎么练?

先说结论&#xff1a;基础阶段学好各个数据结构与&#xff0c;重点是数组、链表、树、图。然后强化阶段突破算法提 在基础阶段&#xff0c;并不需要过于专门地练习算法。相反&#xff0c;基础阶段的重点应该放在对各种数据结构原理的深入理解上。在我个人的经验中&#xff0c;…...

输入框验证数字类型

校验大于0的数,且小数点后最多为八位小数 let k /^(?!0(\.0)?$)\d(\.\d{1,8})?$/; console.log(k.test(0.00000001)); // true console.log(k.test(0.00000000)); // false console.log(k.test(0.12)); // true console.log(k.test(12.12)); // true输入0-1的数字&#xf…...

LeetCode 377——组合总和 Ⅳ

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 此题一看应该就是需要用到动态规划算法&#xff0c;假设我们以 f[d]表示总和为 d 的元素组合的个数&#xff0c;首先&#xff0c;我们遍历 nums 数组&#xff0c; 如果有 nums[i] < target&#xff0c;那么组…...

ubuntu同步网络时间

安装ntpdate sudo apt-get update sudo apt-get install ntpdate设置系统时间与网络时间同步 sudo ntpdate cn.pool.ntp.org设置时区亚洲上海 sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime设置时间为24小时制 echo "LC_TIMEen_DK.UTF-8" >>/…...

Flink学习(四)-数据管道 ETL

一、状态转换 map() 只适用于一对一的转换&#xff0c;即对每个进入算子的流元素&#xff0c;map() 将仅输出一个转换后的元素。 flatmap() 可以输出任意数量的元素&#xff0c;也可以一个都不发。 二、Keyed Streams keyBy() 相当于 sql 中的 group by&#xff0c;通过…...

Python可视化之Matplotlib

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1、解决坐标轴刻度负号乱码2、解决中文乱码问题3、图形展现形式 一、图形绘制1.折线图plot2.散点图plot&scatter3.柱状图plt.bar&条形图plt.barh4.直方…...

ChatGPT全方位解析:如何培养 AI 智能对话技能?

简介 ChatGPT 的主要优点之一是它能够理解和响应自然语言输入。在日常生活中&#xff0c;沟通本来就是很重要的一门课程&#xff0c;沟通的过程中表达的越清晰&#xff0c;给到的信息越多&#xff0c;那么沟通就越顺畅。 和 ChatGPT 沟通也是同样的道理&#xff0c;如果想要C…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...