Python之面向对象(一)

目录

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


面向对象

为什么要面向对象?

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

要素

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

属性:对象的特征

方法:对象的行为

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

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

定义

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

新式类:继承了Object类的类

类的命名遵循大驼峰规则

# 类定义的三种方式
class A():passclass A:passclass A(object):	 # 指定父类pass

一些特性

class ATM():bank="建设银行"money = 50000def 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,则不视为方法,而只是类中的一个函数,无法被实例调用,但可以通过类来调用passnongda_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 = 50000def __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 = 50000def __init__(self, school="qinghua"):# 实例属性self.school = schoolprint("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):passclass 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.rhkb.cn/news/127213.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java(三)逻辑控制(if....else,循环语句)与方法

逻辑控制&#xff08;if....else&#xff0c;循环语句&#xff09;与方法 四、逻辑控制1.if...else(常用)1.1表达格式&#xff08;三种&#xff09; 2.switch...case(用的少)2.1表达式 3.while(常用)3.1语法格式3.2关键字beak&#xff1a;3.3关键字 continue&#xff1a; 4.for…

【web开发】6、Django(1)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Django是什么&#xff1f;二、使用步骤1.安装Django2.创建项目3.创建app4.快速上手 数据库操作1.安装第三方模块2.自己创建数据库3.DJango链接数据库4.DJango操…

vue 部署到本机IIS 部署 SPA 应用

安装 URL Rewrite Works With: IIS 7, IIS 7.5, IIS 8, IIS 8.5, IIS 10 URL Rewrite : The Official Microsoft IIS Site 目前电脑IIS是6版本的&#xff0c;以下的方法不太合适操作。目前用Nginx部署&#xff0c;够用了。 nginx配置参考&#xff1a; uni-app 前面项目&am…

2023年09月编程语言流行度排名

点击查看最新编程语言流行度排名&#xff08;每月更新&#xff09; 2023年09月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多&#xff0c;大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自…

无需麻烦验证,文字验证码一键通过

前言 文字验证码&#xff0c;简单易用&#xff0c;安全可靠&#xff01;不需要麻烦的图形识别。这种验证方式不仅方便快捷&#xff0c;而且能有效防止恶意攻击和机器人访问。无需担心复杂操作&#xff0c;只需几秒钟就能完成验证过程。保护您的个人信息和数据安全&#xff0c;…

QML与C++的交互操作

QML旨在通过C 代码轻松扩展。Qt QML模块中的类使QML对象能够从C 加载和操作&#xff0c;QML引擎与Qt元对象系统集成的本质使得C 功能可以直接从QML调用。这允许开发混合应用程序&#xff0c;这些应用程序是通过混合使用QML&#xff0c;JavaScript和C 代码实现的。除了从QML访问…

『SpringBoot 源码分析』run() 方法执行流程:(2)刷新应用上下文-准备阶段

『SpringBoot 源码分析』run() 方法执行流程&#xff1a;&#xff08;2&#xff09;刷新应用上下文-准备阶段 基于 2.2.9.RELEASE问题&#xff1a;当方法进行了注释标记之后&#xff0c;springboot 又是怎么注入到容器中并创建类呢&#xff1f; 首先创建测试主程序 package …

SpringBoot2.0(Spring读取配置文件常用方法,打war包在Tomcat中启动)

目录 一&#xff0c;SpringBoot中读取配置文件的常用方法1.1&#xff0c;使用Value读取1.2&#xff0c;使用ConfigurationProperties1.3&#xff0c;使用Environment1.4&#xff0c;自定义配置文件读取 二&#xff0c;SpringBoot部署war项目到tomcat9和启动原理 一&#xff0c;…

Day_13 > 指针进阶(2)

目录 1.函数指针数组 2.指向函数指针数组的指针 3.回调函数 qsort()函数 代码示例 void* 4.结束 今天我们在进阶指针的基础上&#xff0c;学习进阶指针的第二部分 1.函数指针数组 首先我们回顾一下指针数组 char* arr[5]://字符指针数组 - 数组 - 存放的是字符指针 in…

vagrant 虚拟机扩容磁盘

vagrant 虚拟机扩容磁盘 修改配置安装插件存储扩容 修改配置 参考博客:https://blog.csdn.net/marina_1/article/details/122238721 vagrant 版本 PS D:\vagrant\workplace\node2> vagrant --version Vagrant 2.3.7修改vagrant虚拟机配置文件Vagrantfile&#xff0c;添加磁…

【100天精通Python】Day56:Python 数据分析_Pandas数据清洗和处理(删除填充插值,数据类型转换,去重,连接与合并)

目录 数据清洗和处理 1.处理缺失值 1.1 删除缺失值&#xff1a; 1.2 填充缺失值&#xff1a; 1.3 插值&#xff1a; 2 数据类型转换 2.1 数据类型转换 2.2 日期和时间的转换&#xff1a; 2.3 分类数据的转换&#xff1a; 2.4 自定义数据类型的转换&#xff1a; 3 数…

【多线程】Timer任务定时器实现与盲等原子性问题的解决

目录 一、定时器 二、标准库中的Timer 三、代码实现 四、死锁 一、定时器 代码中的定时器通常是在一定的时间执行对应的代码逻辑 二、标准库中的Timer public static void main(String[] args){Timer timer new Timer();timer.schedule(new TimerTask() {Overridepublic…

2023国赛C题解题思路代码及图表:蔬菜类商品的自动定价与补货决策

2023国赛C题&#xff1a;蔬菜类商品的自动定价与补货决策 C题表面上看上去似乎很简单&#xff0c;实际上23题非常的难&#xff0c;编程难度非常的大&#xff0c;第二题它是一个典型的动态规划加仿真题目&#xff0c;我们首先要计算出销量与销售价格&#xff0c;批发价格之间的…

Text-to-SQL小白入门(四)指令进化大模型WizardLM

摘要 本文主要对大模型WizardLM的基本信息进行了简单介绍&#xff0c;展示了WizardLM取得的优秀性能&#xff0c;分析了论文的核心——指令进化方法。 论文概述 基本信息 英文标题&#xff1a;WizardLM: Empowering Large Language Models to Follow Complex Instructions中…

Linux下 /sys/class 一些操作

Linux下&#xff0c;/dev、/sys/class的区别 /dev下面有很多节点&#xff0c;每一个节点代表一个设备&#xff0c;/dev目录下面是按物理器件进行分类&#xff1b;而/sys/class下面的更多是按功能抽象出来的。 参考1 demo 在正点原子的基础上进行演示 #include <linux/ty…

【Spring面试】BeanFactory与IoC容器的加载

文章目录 Q1、BeanFactory的作用是什么&#xff1f;Q2、BeanDefinition的作用是什么&#xff1f;Q3、BeanFactory和ApplicationContext有什么区别&#xff1f;Q4、BeanFactory和FactoryBean有什么区别&#xff1f;Q5、说下Spring IoC容器的加载过程&#xff08;※&#xff09;Q…

it运维监控管理平台,统一运维监控管理平台

随着系统规模的不断扩大和复杂性的提高&#xff0c;IT运维管理的难度也在逐步增加。为了应对这一挑战&#xff0c;IT运维监控管理平台应运而生。本文将详细介绍IT运维监控管理平台的作用和优势以及如何选择合适的平台。 IT运维监控管理平台的作用管理平台 IT运维监控管理平台是…

母婴品牌的小红书投放策略有哪些,投放总结

最近有很多人想知道达人投放的一些相关知识&#xff0c;我们立马捕捉到了大家对这一干货内容的感兴趣程度&#xff0c;今天就来为大家分享下&#xff0c;母婴品牌的小红书投放策略有哪些&#xff0c;投放总结&#xff01; 什么是达人投放? 达人投放是一种常用于社交媒体营销的…

【动态规划刷题 12】等差数列划分 最长湍流子数组

139. 单词拆分 链接: 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: …

Browserslist 信息和配置使用整理

我们可以在各种前端工程看到 Browserslist 的配置身影&#xff0c;看似简单但实际上可能会有暗坑导致线上兼容问题&#xff0c;借此文来整理下 Browserslist 的信息。 Browserslist 是由 Autoprefixer 团队维护的一个开源项目&#xff0c;用于自动处理 CSS 和 JavaScript 文件…