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

Python之面向对象(二)

目录

  • 属性和方法
    • 静态属性/方法、普通属性/方法、类方法
    • 保护和私有属性/方法
    • 魔术方法
      • 构造方法(\_\_new__/\_\_init\_\_)
      • 析构方法(\_\_del__)
      • 调用方法(\_\_call__)
      • toString方法\_\_str__、\_\_repr\_\_
      • \_\_getitem__、setitem、delitem
      • \_\_add__、\_\_gt\_\_方法
      • with \_\_enter__、\_\_exit\_\_
    • 内置属性及其功能
  • python自省
  • python元类
  • 抽象基类


属性和方法

静态属性/方法、普通属性/方法、类方法

class A():name = "changsha"	# 静态属性,类属性def __init__(self):self.country="china"	# 普通属性,实例属性#普通(实例)方法#接收的第一个参数,就代表实例本身def normal_method(self,name):pass# 类方法,	使用classmethod.装饰的方法,称为类方法# 接收的第一个参数是类@classmethoddef class_method(cls,name):pass# 静态方法,	使用staticmethod装饰的方法,不装饰的话实例调用该方法时默认会传递实例对象给方法的,这样就会报错# 可以接收参数也可以不接受参数,参数不代表实例也不代表类@staticmethoddef static_method(name):pass

实例可以调用三种方法,用类去调用实例方法时需手动传入一个实例

保护和私有属性/方法

class test:name = ""_name = ""	# 保护属性__name = ""	# 私有属性def _func(self):	# 保护方法passdef __func(self):	# 私有方法pass

对于保护属性和方法,使用起来与普通属性和方法没有区别,只是在使用import * 时不能被导入

对于私有属性和方法,其实是伪私有。不过是将双下划线的属性或方法改了一个名字为: _类__标识名

class test:__name = "私有属性"  # 私有属性def __func(self):  # 私有方法print("私有方法")t = test()
print(t._test__name)	# 通过这样的格式即可调用
t._test__func()

魔术方法

所有以双下划线开头和结尾的方法,统称为魔术方法(magic method)

这种魔术方法不需要调用,在特定场景下自动执行。

由于markdown格式下对下划线做纠正太麻烦了,所以下面有的地方可能格式有些不正确,但能明白我指的是那个方法就行

构造方法(__new__/__init__)

new:创建实例

init:初始化实例

析构方法(__del__)

在实例释放、销毁的时候自动执行的,通常用于做一些收尾工作, 如关闭一些数据库连接,关闭打开的临时文件等

class a:def __del__(self):print("del")a1 = a()
del a1	# 此时就会自动调用del方法,不手动del时,等程序执行结束时也会自动执行del方法

调用方法(__call__)

把类实例化后的对象当做函数来调用的时候自动被调用

class a:def __call__(self):print("call")a1 = a()
a1()	# 此时就会执行call方法,像函数、类都是通过call方法来实现的

toString方法__str__、__repr__

有str方法时使用str方法,没有就使用repr方法

class A():def __str__(self):return "str...A"def __repr__(self):return "repr...A"
a = A()
print(a)	# print一个实例时就是调用str方法
str_a = str(a)	# 使用str()函数时也是调用实例中的str方法# 当在交互式命令行中输入a之后回车,就会调用repr方法输出内容

__getitem__、setitem、delitem

使类的实例能够像字典一样被使用,适合用来进行配置

class A():def __init__(self):self.data = {}	# 初始化个空字典def __getitem__(self, key):return self.data.get(key, 0)	# key存在返回value,不存在返回0def __setitem__(self, key, value):self.data[key] = valuedef __delitem__(self, key):del(self.data[key])
a = A()
a["name"] = "sc"	# 此时调用setitem方法,name传给key,sc传给value
print(a["name"])	# 此时调用getitem方法
del a["name"]		# 调用delitem方法

__add__、__gt__方法

自定义 加法 和 大于方法

class A:def __init__(self,num):self.time = time.time()self.num = numdef __add__(self,x):print("this is add")return self.num + xdef __gt__(self,other):print("this is gt")return self.time > other.time	# 根据创建的时间戳来比大小,越新创建的越大
a1 = A(5)
b = a1 + 3		# 调用add方法
print("b is :"b)
a2 = A(4)
print(a1>a2)	# 调用gt方法

with __enter__、__exit__

使用with语句管理的对象 称为 上下文管理器对象

都会实现enter、exit魔术方法

enter做一些初始化工作

exit做一些结束收尾工作,释放资源

内置属性及其功能

__dict__:类的属性(包含一个字典,由类的数据属性组成)

__doc__:类的文档字符串

__name__:类名

__module__:类定义所在的模块

__bases__:类的所有父类构成元素

__class__:类型,比如类就返回type,实例就返回它的父类

python自省

对某一个对象属性(方法)的增删改查

#python自省
print(hasattr(math,"xx"))	#判断math有没有xx属性
print(setattr(math,"xx",1))	#设置math的xx属性为1
print(getattr(math,"xx")	#获取math的xx属性
print(delattr(math,"xx"))	#删除math的xx属性def func2():pass
setattr(a,"func",func2)	# 将func2方法添加到a实例中并命名为func

python元类

创建类的类称之为元类

一些基本类的元类都是type

print(str.__class__)	# 输出:<class 'type'>
>>> print(object.__class__)		# object是所有类的父类,这是从继承的角度
<class 'type'>		# type是创建类中最顶层的类,这是从实例和类的角度
# 两者的关系很难说,type继承了object,但object又由type创建

可以自定义一个元类

class MyMate(type):		# 继承type类#拦截类的创建#			  名字 继承(元组)	方法属性(dict)def __new__(cls,name,bases,attrs):attrs["test"] = "mymate test"print(name,bases,attrs)return type.__new__(cls,name,bases,attrs)
class A(metaclass=MyMate):passa = A()
print(a.test)

抽象基类

抽象基类 定义了接口规范,子类必须实现父类里面的抽象方法

抽象类不能实例化

想定义抽象基类,需要先导入ABC模块:

from abc import ABC, abstractmethod

ABC模块提供了一种定义抽象基类的方式,是指"Abstract Base Classes"(抽象基类)模块。它是Python标准库中的一个模块,位于abc包中。

from abc import ABC,abstractmethod
#抽象基类
class A(ABC):@abstractmethod		# 被这个装饰的方法称为抽象方法def eat(self):passdef drink(self):	# 没有被@abstractmethod装饰的方法为普通方法pass
class B(A):				# 子类必须实现父类中的抽象方法def eat(self):print("this is eat")
b = B()

相关文章:

Python之面向对象(二)

目录 属性和方法静态属性/方法、普通属性/方法、类方法保护和私有属性/方法魔术方法构造方法(\_\_new__/\_\_init\_\_)析构方法(\_\_del__)调用方法&#xff08;\_\_call__&#xff09;toString方法\_\_str__、\_\_repr\_\_\_\_getitem__、setitem、delitem\_\_add__、\_\_gt\_…...

ESP32用作经典蓝牙串口透传模块与手机进行串口通信

ESP32用作经典蓝牙串口透传模块与手机进行串口通信 简介ESP32开发板Arduino程序手机与ESP32开发板进行蓝牙串口透传通信总结 简介 ESP32-WROOM-32模组集成了双模蓝牙包括传统蓝牙&#xff08;BR/EDR&#xff09;、低功耗蓝牙&#xff08;BLE&#xff09;和 Wi-Fi&#xff0c;具…...

Python 操作 CSV

使用过 CSV 文件都知道&#xff1a;如果我们的电脑中装了 WPS 或 Microsoft Office 的话&#xff0c;.csv 文件默认是被 Excel 打开的&#xff0c;那么什么是 CSV 文件&#xff1f;CSV 文件与 Excel 文件有什么区别&#xff1f;如何通过 Python 来操作 CSV 文件呢&#xff1f;带…...

自动化运维工具Ansible教程(二)【进阶篇】

文章目录 前言Ansible 入门到精通自动化运维工具Ansible教程(一)【入门篇】自动化运维工具Ansible教程(二)【进阶篇】精通篇 进阶篇1. Ansible 的高级主题&#xff08;例如&#xff1a;角色、动态清单、变量管理等&#xff09;**1. 角色&#xff08;Roles&#xff09;**&#x…...

嵌入式Linux基础学习笔记目录

1. 嵌入式Linux应用开发基础知识 1.1 交叉编译 1.2 GCC编译器 1.3 makefire 1.4 文件I/O 1.5 Framebuffer应用编程 1.6 文字显示及图象显示 1.7 输入系统应用编程 1.8 网络编程 1.9 多线程编程 1.10 串口编程 1.11 I2C应用编程 2. 源码分析 2.1 MQTT源码 2.2 蓝牙源码 2.3 MJP…...

JVM | 垃圾回收器(GC)- Java内存管理的守护者

引言 在编程世界中&#xff0c;有效的内存管理是至关重要的。这不仅确保了应用程序的稳定运行&#xff0c;还可以大大提高性能和响应速度。作为世界上最受欢迎的编程语言之一&#xff0c;通过Java虚拟机内部的垃圾回收器组件来自动管理内存&#xff0c;是成为之一的其中一项必…...

yolov5添加ECA注意力机制

ECA注意力机制简介 论文题目&#xff1a;ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks 论文地址&#xff1a;here 基本原理 &#x1f438; ECANet的核心思想是提出了一种不降维的局部跨通道交互策略&#xff0c;有效避免了降维对于通道注意…...

华为在高端智能手机市场再次撕开了一道深深的口子

智能手机市场趋于饱和&#xff0c;增长变得越来越难&#xff0c;智能手机厂商从被动卷走向了主动卷。 8月29日&#xff0c;华为宣布推出“HUAWEI Mate 60 Pro先锋计划”&#xff0c;并于当天中午在官方商城、部分线下门店上线销售新机Mate 60 Pro&#xff0c;它是全球首款支持卫…...

前端设计模式和设计原则之设计模式

作为前端开发&#xff0c;在code时&#xff0c;或多或少地都会践行设计模式&#xff0c;但是你清楚自己用到的是何种设计模式吗&#xff1f; 为什么前端开发一定要懂设计模式呢&#xff1f; code时不遵从设计模式&#xff0c;又能怎样呢&#xff1f; 上面的问题可以留作思考…...

提高在速卖通产品上的曝光率——自养号测评优势全面解析!

速卖通是国际贸易的一个平台&#xff0c;是国内外企业之间的一个桥梁。在速卖通中&#xff0c;如果要让产品得到更好地推广&#xff0c;就必须让产品得到更多的消费者认可。而产品的认可度除了品质保障和售后服务之外&#xff0c;评测也是非常重要的环节。 对于速卖通店铺销量…...

指针进阶(二)

指针进阶 5.函数指针6. 函数指针数组7. 指向函数指针数组的指针8. 回调函数案例&#xff1a;使用回调函数&#xff0c;模拟实现qsort&#xff08;采用冒泡的方式&#xff09;。案例&#xff1a;测试qsort排序结构体数据 5.函数指针 补&#xff1a; &函数名就是函数的地址 …...

【HCIE】03.BGP高级特性

每一条BGP路由都可以携带多个路径属性&#xff0c;针对其属性也有特有的路由匹配工具&#xff0c;包括&#xff1a;AS Path Filter和Community Filter。 import方向的属性&#xff0c;出现在如策略里面&#xff0c;加入到BGP路由表中&#xff0c;再传给路由表里&#xff0c;出去…...

单个处理数据祖籍列表层级关系

CREATE DEFINERroot% FUNCTION sys_organization_getAncestorsNames(deptId varchar(36)) RETURNS varchar(1000) CHARSET utf8DETERMINISTIC BEGINDECLARE parentDeptId varchar(36) default ; -- 父部门iddeclare parentDeptName varchar(100) default ; -- 父部门名称decla…...

Maven部署打包多环境(开发、测试、生产)配置教程

Maven打包多环境&#xff08;开发、测试、生产&#xff09;配置教程 1、多环境配置的必要性1.1 没有进行多环境配置进行的操作复杂性1.2 不影响运行时配置 2、配置方案2.1 添加profile属性2.1 添加两个插件2.3 主配置文件中添加插值变量 3、效果展示3.1 勾选prod环境3.2 控制台…...

【计算思维题】少儿编程 蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套

蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第9套 第十四届蓝桥杯省赛真题 1、要把下面4张图片重新排列成蜗牛的画像,该如何排列这些图片 A、 B、 C、 D、 答案:A 考点分析:主要考查小朋友们的观察能力空...

【Hello Algorithm】贪心算法

本篇博客介绍&#xff1a; 简单介绍下贪心算法 贪心算法 介绍贪心算法最小字典序的字符串拼接最多会议数切棍子的最小成本IPO灯塔问题 介绍贪心算法 贪心算法是一种极具有自然智慧的算法 它会使用以一种局部最功利的标准来做出一个当前看来最好的选择 如果说我们根据局部最优…...

TOP-K问题

目录 问题描述 解法及思想 第一种方式 算法思想 具体实现 第二种方式 算法思想 具体实现 问题描述 Top-K问题是一个十分经典的问题&#xff0c;一般有以下两种方式来描述问题&#xff1a; 在10亿的数字里&#xff0c;找出其中最大的100个数&#xff1b;在一个包含n个整…...

【保姆级从0到1】UE5 蓝图入门教程1:关卡、蓝图入门

20230113 1、新建项目 新建选择 UE 5.1 项目 选择蓝图&#xff0c;项目位置 改变编辑器布局&#xff0c;选择经典布局 2、关卡与蓝图 选择 File -> New Level 准备创建关卡 选择 Basic&#xff0c;点击 Create 进行创建 Ctrl S 保存新建的关卡 关卡蓝图的打开 鼠标右键&…...

【码银送书第六期】《ChatGPT原理与实战:大型语言模型的算法、技术和私有化》

写在前面 2022年11月30日&#xff0c;ChatGPT模型问世后&#xff0c;立刻在全球范围内掀起了轩然大波。无论AI从业者还是非从业者&#xff0c;都在热议ChatGPT极具冲击力的交互体验和惊人的生成内容。这使得广大群众重新认识到人工智能的潜力和价值。对于AI从业者来说&#xf…...

redis 报错 Redis protected-mode 配置文件没有真正启动

(error) DENIED Redis is running in protected mode because protected mode is enabled Redis protected-mode 是3.2 之后加入的新特性&#xff0c;在Redis.conf的注释中&#xff0c;我们可以了解到&#xff0c;他的具体作用和启用条件 链接redis 时只能通过本地localhost …...

解决a标签内容中img标签和p标签垂直方向间隔太大的问题

现象如下&#xff1a; 对应的html结构&#xff1a; 解决办法&#xff1a;给a标签设置&#xff1a;display: inline-block和line-height属性。 然后问题解决&#xff1a; 具体原理如下&#xff08;由chatgpt回答&#xff09;&#xff1a; display: inline-block 可以减少垂直方…...

如何选择靠谱的全景平台?VR全景加盟从哪方面对比?

VR全景行业经过近几年的发展&#xff0c;已经逐渐普及开来&#xff0c;线下各个行业都有实体商家开始引入VR全景去做营销宣传推广了。不少老板也意识到线上线下双渠道的重要性&#xff0c;而VR全景的存在就刚好满足各行各业的需求&#xff0c;从这一点不难看出&#xff0c;VR全…...

CentOS系统环境搭建(十八)——CentOS7安装Docker20.10.12和docker compose v2

centos系统环境搭建专栏&#x1f517;点击跳转 CentOS7安装Docker20.10.12和docker compose v2 关于Docker旧版本和docker compose1.0版本的安装可以看这一篇CentOS系统环境搭建&#xff08;三&#xff09;——Centos7安装Docker&Docker Compose。 1.卸载旧版本 卸载do…...

NebulaGrap入门介绍和集群安装部署

长风破浪八千里&#xff0c;落日晚霞不回头。 ——大宁。 NebulaGrap——分布式图数据库 官方文档&#xff1a; ​ NebulaGraph Database手册 ​ 官方文档 介绍 简介&#xff1a; ​ NebulaGraph 一款开源、分布式图数据库&#xff0c;擅长处理超大规模数据集。 Nebula …...

thinkphp5.0 composer 安装oss提示php版本异常

场景复现&#xff1a; 本地 phpstudy 环境&#xff0c;安装的有7.0到7.3三个版本&#xff0c;首先确认composer已经安装 composer安装阿里云oss的命令为&#xff1a;composer require aliyuncs/oss-sdk-php 运行报错&#xff1a; Problem 1- Root composer.json requires php…...

AList dokcer安装及百度网盘挂载

AList是开源的网盘管理工具。本文介绍如何通过docker安装AList并挂载百度网盘 1、AList安装 1.1、系统安装 通过docker命令进行安装&#xff0c;命令如下: docker run -d --restartalways -v /etc/alist:/opt/alist/data -p 5244:5244 --name"alist" xhofe/alist:…...

whereIn 遇到了最大限制,临时表处理方式

当使用whereIn 遇到了限制&#xff0c;比如whereIn target ID 已经超过了10万级别&#xff0c;但是又没办法join其他库表时&#xff0c;可以使用临时表的方式解决&#xff0c;临时表是以一种会话的方式存在&#xff0c;意味着你断开了mysql 这个临时会话会自动销毁。 为了创建…...

基于SSM的校园快递代取系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

MySQL事务详细讲解

文章目录 什么是事务:1.事务有哪些特性2.并发事务会引起什么问题3.事务的隔离级别有哪些4.Read View在MVCC中如何工作Read View 有四个重要的字段使用 InnoDB 存储引擎的数据库表&#xff0c;它的聚簇索引记录中都包含下面两个隐藏列&#xff1a; 5.可重复读是怎么工作的6.读提…...

[linux] mmcv-full 安装的时候 Building wheel 卡住

&#xff08;已解决&#xff09;FileNotFoundError: [Errno 2] No such file or directory: ‘:/usr/local/cuda-11.8/bin/nvcc‘_鳗小鱼的博客-CSDN博客 安装mmcv一直卡在建车轮_梦想成为大佬的王老八的博客-CSDN博客 pip install -U openmim mim install mmcv...

wordpress 后台打开慢/兰州网站seo服务

开发准备 第1步&#xff1a;准备好百度智能云的账号 第2步&#xff1a;在百度智能云领取对应AI开发的免费资源包 第3步&#xff1a;创建对应的应用&#xff0c;然后获取对应的开发信息&#xff0c;主要是下面几个 AppID&#xff1a;应用列表中 API Key&#xff1a;应用列表…...

图书馆登录系统网站建设代码/接单平台app

1. Mantle Mantle 让我们能简化 Cocoa 和 Cocoa Touch 应用的 model 层。简单点说&#xff0c;程序中经常要进行网络请求&#xff0c;请求到得一般是 json 字符串&#xff0c;我们一般会建一个 Model 类来存放这些数据。这就要求我们编写一系列的序列化代码&#xff0c;来把 js…...

岚山网站建设/外贸网站搭建推广

3巧记单词的方法二【方法一】稀里糊涂型平时英语课本上记一些&#xff0c;看美剧又记一些&#xff0c;考四六级之前再突击一下“要你命3000”之类的宝典&#xff0c;这些方法比较机械&#xff0c;也很难有组织、有规划地去记忆学习&#xff0c;不过大多数同学应该都是属于这种情…...

建筑工程网是什么网站/读书网站排名

描述 如题&#xff0c;输入一个日期&#xff0c;格式如&#xff1a;2010 10 24 &#xff0c;判断这一天是这一年中的第几天。输入第一行输入一个数N&#xff08;0<N<100&#xff09;,表示有N组测试数据。后面的N行输入多组输入数据&#xff0c;每行的输入数据都是一个按题…...

安贞网站建设公司/站长工具友链检测

注意事项请确保林的功能级别至少为 Windows Server 2008&#xff0c;并确保架构主机运行 Windows Server 2008 或更高版本。Windows Server 2012 和 Windows Server 2012 R2 的完全安装选项必须用于所有运行 Exchange 2016 服务器角色或管理工具的服务器。必须首先将计算机加入…...

wordpress 小工具天气/网站搭建服务

3.0之后推荐用actionbar&#xff0c;Menu已经过时但是我们还是了解一下吧&#xff0c;Menu学习在java语句中添加menu组件 重写onCreateOptionsMenu(Menu menu)方法Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuItem menuItem1 menu.add(100, 100, 1, "系…...