Python之面向对象(一)

news2024/9/22 13:32:07

目录

  • 面向对象
      • 为什么要面向对象?
      • 要素
    • 定义
    • 一些特性
    • 内存空间
    • 实例的创建与初始化
      • 创建实例方法__new__
      • 初始化实例方法__init__
    • 类的继承
    • 多态
    • 新式类与经典类


面向对象

为什么要面向对象?

方便版本更新迭代,程序结构清晰明了

要素

类:用来描述具有相同属性和方法的对象的集合

属性:对象的特征

方法:对象的行为

对象实例:类的一个具体的例子

class Student:
    # 属性
    school = "清华大学"
    # 方法
    def eat(self):
        print("eat meal")
# 实例化
zhangsan = Student()
print(zhangsan.school)
zhangsan.eat()

定义

类在python2中分为新式类和经典类,在python3中只有新式类

新式类:继承了Object类的类

类的命名遵循大驼峰规则

# 类定义的三种方式
class A():
    pass

class A:
    pass

class A(object):	 # 指定父类
    pass

一些特性

class ATM():
	bank="建设银行"
	money = 50000
	def draw_money(self,getmoney):		# 函数的命名遵循小写加下划线的原则
		if getmoney <= self.money:		# 与java不同,在类的方法中,不能直接使用类的属性,无法识别,需要通过self来进行调用
			self.money -= getmoney		# self并非一定要取self,其它名字也可以,调用函数时无需我们传入,py解释器会自动传入当前实例
			print(f"取了{getmoney}元,还剩余{self.money}元")
		else:
			print("atm余额不足")

    def test():			# 当函数没有传入self,则不视为方法,而只是类中的一个函数,无法被实例调用,但可以通过类来调用
        pass

nongda_atm = ATM()
print(nongda_atm.money)
nongda_atm.draw_money(3000)
nongda_atm.draw_money(3000)
ATM.test()

ATM.provide = "湖南"		# 可以直接添加一个新的类的属性并且修改
print(nongda_atm.provide)

内存空间

分为类空间和实例空间

当实例用到某个属性或者方法时会先在自身实例空间找,找不到就去类空间找,并复制一份到自身实例空间,还找不到就去父类空间找,都找不到报 AttributeError属性异常

创建实例的时候,会有一个类对象指针,通过这个指针,实例就能访问类的属性方法了

实例的创建与初始化

创建实例方法__new__

当自定义类没有重写__new__方法时,会调用父类object的new方法(因此新式类才有–new–)

new方法一般也不会进行重写

class ATM():
    # 类属性
    money = 50000

    def __new__(cls,*args,**kwargs):	# arg用于接收参数传给init
        # cls代表当前类
        print("this is new")
        print("cls is",cls)
        print("args is",args)
        return object.__new__(cls)		# 最后还是调用object的new方法,会返回一个实例对象self

初始化实例方法__init__

在new方法执行完后对创建好的实例进行初始化(如果new方法返回的不是当前类的实例,init不执行)

class ATM():
    # 类属性
    money = 50000

    def __init__(self, school="qinghua"):
        # 实例属性
        self.school = school
        print("i am init")

# 测试
q_atm = ATM()
print(q_atm.school)
n_atm = ATM("nongda")
print(n_atm.school)
# print(ATM.school)     # 类空间中并没有school属性

类的继承

好处:增加代码复用率

python中可以继承多个父类,用逗号分隔

class Animal():
    def __init__(self):
        pass

class Person(Animal):	# 继承Animal类
    def __init__(self):		# 重写父类方法
        super().__init__()		# super()调用父类的方法,不是必要的,一般都放在第一行,避免自定义属性被覆盖
        self.name = "Person"

p = Preson()
print(isinstance(p, Person),isinstance(p, Animal))	# True,True	--判断实例是否是某个类的实例
print(type(p))			# <class '__main__.Person'>	--查看类型
print(Person.__base__)		# <class '__main__.Animal'>	--查看继承关系

多态

接口的多种不同实现方式即为多态。

python的多态不同于其它语言的多态,其它语言多是通过继承父类和重写父类方法来实现多态。而python本身就是一种动态的语言,处处都是多态

class ZhiFuBao(){
    def pay(self){
        print("zhifubao")
    }
}
class WeiXin(){
    def pay(self){
        print("weixin")
    }
}
# 接口
def pay(obj){	# 特别之处就在于此,python不关心对象的类型,只关心行为
    obj.pay()	# 并且不管什么类型,只要有pay()方法就行
} 

z = ZhiFuBao()
w = WeiXin()
# 通过相同的接口,不同的实例有不同的实现
pay(z)
pay(w)

新式类与经典类

区别一:继承了内置类的类都是新式类,python3后都是新式类

区别二:(重点)对于父类的解析顺序有所不同,经典类为深度优先;新式类则是C3算法————深度优先+子类优先,同级别父类从左到右考虑

C3算法:

首先将自身加入到本序列,然后对继承序列的元素依次判断
若某元素不在其他序列或者他是所有继承序列的第一个,那么就把这个元素提取到本序列

C3算法将每个分支节点的父类按照上面的原则得到的顺序合并为一个列表,并将当前节点加入到列表的最前面。

C3算法的实现由super()函数来完成,它会自动按照MRO(方法解析顺序)调用父类的方法。

在这里插入图片描述

对于上面的继承关系(A为所有类的父类),

在经典类中,F的方法解析顺序为:F——》D——》B——》A——》E——》C

在新式类中,解析顺序则为:F——》D——》B——》E——》C——》A

本来按照深度优先来说A应该在E前面,但根据子类优先来说,E、C为A的子类,所以先解析

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

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

相关文章

ClickHouse进阶(十一):Clickhouse数据字典-1

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

肖sir__设计测试用例方法之编写测试用例12

编写测试用例 一、用例模板 案例1&#xff1a; 案例2&#xff1a; 案例3&#xff1a; 二、测试工作重点&#xff1a; 编写测试用例、 执行用例 &#xff08;依据测试用例&#xff09; 三、测试流程&#xff08;h模型&#xff09; 1、拿到需求 2、编写测试计划&#xff08;…

vue项目搭建

安装node node官网获取安装包 下载好的安装包&#xff0c;后面重复点击下一步&#xff08;Next&#xff09;就行 安装完成后&#xff0c;关闭窗口即可 windows键R键打开小窗口&#xff0c;然后输入cmd打开命令行 node -v检查安装的node版本 npm -v检查安装的npm版本&#…

【云原生进阶之PaaS中间件】第一章Redis-1.6.1Java项目使用Redis

1 Java 使用 Redis 1.1 方案简述 redis的java客户端很多&#xff0c;官方推荐的有三种&#xff1a; JedisLettuceRedissonSpring 对Redis 客户端进行了整合&#xff0c;提供了Spring Date Redis &#xff0c;在Spring Boot项目中还提供了对应的Starter&#xff0c;即spring-b…

高级IO---五种IO模型多路转接之Select

文章目录 五种IO模型1、阻塞IO2、非阻塞IO3、信号驱动IO4、多路转接IO5、异步IO总结IO 同步与异步阻塞与非阻塞设置非阻塞利用fcntl接口实现一个设置非阻塞的函数 多路转接之Selectselect函数原型fd_set结构返回值 socket就绪条件读就绪写就绪 select的特点select使用示例Util.…

Flowable 之任务分配

文章目录 一、任务分配和流程变量1.1 任务分配1.1.1 固定分配1.1.2 表达式分配① 值表达式② 方法表达式 1.1.3 监听器分配 1.2 流程变量1.2.1 全局变量1.2.2 局部变量1.2.3 案例讲解 二、候选人和候选人组2.1 候选人2.1.1 部署和启动流程2.1.2 任务的查询2.1.3 任务的拾取2.1.…

FRR+BFD+OSPF与BGP联动

1.拓扑设计 2.拓扑介绍 如图&#xff0c;LY集团 由核心机房与接入层网络组成&#xff0c;集团网络需要通过核心机房访问互联网&#xff0c;集团网络运行OSPF与IBGP协议&#xff1b;集团网络中接入层网络正常经过R2访问互联网&#xff0c;如果R2设备失效后&#xff0c;应立即换到…

Git版本管理

Git版本介绍 Git 是一个分布式版本控制系统&#xff0c;它被广泛用于协作软件开发和管理代码的变更。Git 的设计目标是为了处理速度快、灵活性强、数据完整性好的版本管理需求。以下是 Git 版本管理的详细介绍&#xff1a; 版本控制系统 (VCS)&#xff1a; Git 是一种版本控制…

深度ESP32 PWM教程如何在ESP32 中使用PWM

关于ESP32PWM的简要说明 ESP32 SoC 满载了非常有用的外设&#xff0c;PWM 就是其中之一。是的。ESP32 的芯片中有一个专用的 PWM 硬件模块。脉宽调制或简称PWM是一种成熟且广泛使用的供电技术。 您可以使用 ESP32 的 PWM 来驱动 LED、电机&#xff08;普通直流电机和无刷电机…

Vue2项目练手——通用后台管理项目第六节

Vue2项目练手——通用后台管理项目 用户管理页table表格获取表格数据目录列表user.jsmock.jsindex.jsUsers.vue 新增和编辑功能Users.vue 删除功能使用的组件Users.vue 用户管理页 table表格 使用的组件和前面的表格使用的一致。 获取表格数据 目录列表 user.js import Mo…

基于SpringBoot的在线拍卖系统

基于SpringBootVue的在线拍卖系统&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 后台&#xff1a;用户管理、商品类型管理…

无需设计经验,也能制作出精美的房地产电子传单

在数字化时代&#xff0c;传统的纸质传单已经不能满足人们对于互动和个性化的需求。为此&#xff0c;许多房地产公司开始将目光转向H5微传单&#xff0c;这是一种通过互联网和手机浏览器来传达信息的创新方式。今天&#xff0c;我们将教你如何使用乔拓云网制作房地产微传单H5&a…

STC单片机+EC11编码器实现调节PWM输出占空比

STC单片机+EC11编码器实现调节PWM输出占空比 📌相关篇《stc单片机外部中断+EC11编码器实现计数功能》 📍《STC15单片机特有的PWM寄存器和普通定时器实现PWM输出》 🎬效果演示: 🌼 通过逻辑分析仪获取P11引脚上的信号波形,查看其对应输出的占空比。 ✨本例程基于上面两…

Laravel 模型的关联写入多对多的关联写入 ⑩③

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

vue 页面加水印

首先创建一个waterMark.js文件&#xff0c;当然文件命名可自定义&#xff0c; use strictconst watermark {}/**** param {要设置的水印的内容} str* param {需要设置水印的容器} container*/ const setWatermark (str, container) > {const id 1.23452384164.123412415…

计算机网络第一章:概述

一.因特网概述 1.1网络、互联网(互连网)和因特网 网络由若干结点和连接这些结点的链路组成&#xff0c;可以是有线链路&#xff0c;也可以是无线链路 互连网&#xff1a;多个网络通过路由器互连起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互连网。因此…

spring注解@Component、@controller、@service、@repository

使用之前需要在spring.xml配置文件中配置 只有扫描正确&#xff0c;且应标记注解的类正确标记过后&#xff0c;spring容器才会帮组我们创建并且管理bean对象 Component注解 作用&#xff1a;把普通pojo实例化到spring容器中&#xff0c;相当于之前xml配置文件中的 &#xff…

【数据结构】链表C++编写的,它定义了一个链表,并实现了一些基本的链表操作,如创建新节点、插入节点、清空链表、输出链表以及查找节点

// 引入标准输入输出流库&#xff0c;用于输出操作 #include <iostream> // 引入标准库中的stdlib&#xff0c;包含了rand()函数和其他相关函数 #include <cstdlib> // 引入标准库中的time&#xff0c;包含了time()函数和其他相关函数 #include <ctim…

【Linux】高级IO --- Reactor网络IO设计模式

人其实很难抵制诱惑&#xff0c;人只能远离诱惑&#xff0c;所以千万不要高看自己的定力。 文章目录 一、LT和ET模式1.理解LT和ET的工作原理2.通过代码来观察LT和ET工作模式的不同3.ET模式高效的原因&#xff08;fd必须是非阻塞的&#xff09;4.LT和ET模式使用时的读取方式 二…

正反向代理理解

正向代理&#xff08;Forward Proxy&#xff09;和反向代理&#xff08;Reverse Proxy&#xff09;是两种用于网络通信的代理服务器&#xff0c;它们分别用于不同的场景和目的。 正向代理&#xff08;Forward Proxy&#xff09;&#xff1a; 正向代理是位于客户端和目标服务器…