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.hqwc.cn/news/102086.html

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

相关文章

ffmpeg-android studio创建jni项目

一、创建native项目 1.1、选择Native C 1.2、命名项目名称 1.3、选择C标准 1.4、项目结构 1.5、app的build.gradle plugins {id com.android.application }android {compileSdk 32defaultConfig {applicationId "com.anniljing.ffmpegnative"minSdk 25targetSdk 32…

LeetCode 865. Smallest Subtree with all the Deepest Nodes【树,DFS,BFS,哈希表】1534

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

聚鑫数藏平台——引领数字资产管理新风向

随着数字经济的飞速发展&#xff0c;新金融生态应运而生。区块链技术的崭新突破&#xff0c;使数字资产的重要性日益凸显&#xff0c;为投资者带来了前所未有的机遇和挑战。在此背景下&#xff0c;聚鑫数藏平台横空出世&#xff0c;引领着数字资产管理的新风向。 聚鑫数藏平台&…

UDP聊天室

1.头文件 /* * 文件名称&#xff1a;UDP.h * 创 建 者&#xff1a;crx * 创建日期&#xff1a;2023年09月3日 * 描 述&#xff1a; */ #ifndef _UDP_H #define _UDP_H#include <stdio.h> #include <sys/types.h> /* See NOTES */ #includ…

TypeScript断言

什么是断言&#xff1f; 一个编译时语法&#xff0c;用于告诉编译器用户比编译器更加确定变量的类型&#xff0c;进而解除编译错误&#xff0c;类型断言有点类似于其他语言的类型转换&#xff0c;但它没有运行时的影响&#xff0c;只是在编译阶段起作用。所以&#xff0c;即使通…

QT Day5思维导图

聊天室代码&#xff1a; #include "cli.h" #include "ui_cli.h"Cli::Cli(QWidget *parent): QWidget(parent), ui(new Ui::Cli) {ui->setupUi(this);socket new QTcpSocket(this);connect(socket,&QTcpSocket::connected,this,&Cli::connect_…

2023年全国大学生数学建模B题

多波束测线问题 1.问题提出 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播&#xff0c;在不同界面上产生反射&#xff0c;利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信号&#xff0c;并记录从声波发射到信号接…

C#开发的OpenRA游戏之系统参数选项按钮

C#开发的OpenRA游戏之系统参数选项按钮 前面分析了信标按钮,从图上可以看到,靠右边的按钮,就是系统参数选项按钮: 这个按钮与前面三个按钮是不一样的,虽然它们在排列位置上是放在一起,但是处理的方法方式是不一样的,因为这个选项按钮,并不需要发命令给服务器,再返回来…

《Effective STL》读书笔记(二):vector和string

vector 和 string 优先于动态分配数组 当使用new动态分配内存时&#xff0c;我们需要关注以下内容 必须保证动态分配的内存会被delete&#xff0c;否则会造成资源泄露必须确保使用了正确的delete形式。如果分配了单个对象&#xff0c;则必须使用delete&#xff1b;如果分配了…

Python实现猎人猎物优化算法(HPO)优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

浅谈能源汽车下乡充电桩建设优化建议及解决方案

1.趋势分析 新能源汽车下乡已经成为提振汽车市场表现、推动汽车行业发展的重要措施。国家发改委日前也提出&#xff0c;汽车消费是支撑消费的“大头”&#xff0c;将加快推进充电桩和城市停车设施建设&#xff0c;大力推动新能源汽车下乡&#xff0c;鼓励汽车企业开发更适宜县…

将目标检测项目移植到linux上出现OSERROR

在windows上运行项目正常&#xff0c;但是在centos9上运行出现找到资源&#xff0c;第一次遇到这个问题&#xff0c;通过代码回找&#xff0c;一步一步发现&#xff0c;读取数据没问题&#xff0c;但是在预测的时候无法读取&#xff0c;查到的资料 说明显示字体问题&#xff0c…