Python基础21 面向对象(4)进阶 类的一些内置方法和属性

文章目录

  • 一、模块调用中attr类函数的运用
    • 1、执行模块以外的模块调用
    • 2、执行模块调用自己
  • 二、\_\_getattribute__()方法的运行逻辑
  • 三、item系列方法
  • 四、\_\_str__()方法
  • 五、\_\_repr__()方法
  • 六、自定制格式化方法
  • 七、__slots__属性
  • 八、\_\_doc__属性
  • 九、__module__和__class\_\_
  • 十、析构方法
  • 十一、\_\_call__()方法
  • 十二、迭代器协议的进一步理解

一、模块调用中attr类函数的运用

1、执行模块以外的模块调用

import test as t	# test模块中有Pr函数print(hasattr(t,"Pr"))  # True
print(hasattr(t,"Pr1")) # False

2、执行模块调用自己

x = 10import sys
obj = sys.modules[__name__]
print(getattr(obj,"x")) # 10

二、__getattribute__()方法的运行逻辑

系统自己写的__getattribute__()方法运行逻辑:实例化时,先运行__getattribute__()方法。__getattribute__()方法会去查询实例和类的属性字典,如果字典中有对应的key,则返回value。如果属性字典中没有key,则会raise AttributeError,然后运行__getattr__()。
如果代码中重写了__getattribute__()方法,实例化时,则会运行重写的__getattribute__()方法,不去运行系统写的。

class Foo:x = 10def __init__(self,y):self.y = ydef __getattr__(self, item):print("运行__getattr__",item)def __getattribute__(self, item):print("__getattribute__", item)raise AttributeError("no has attr!")f1 = Foo(5)
f1.y
'''
__getattribute__ x
运行__getattr__ x
'''

三、item系列方法

class Foo:def __getitem__(self, item):print("getitem!")return self.__dict__[item]def __setitem__(self, key, value):print("setitem!")self.__dict__[key] = valuedef __delitem__(self, key):print("delitem!")self.__dict__.pop(key)f1 = Foo()f1["age"] = 18  # setitem!
print(f1.__dict__)  # {'age': 18}print(f1["age"])
'''
getitem!
18
'''
del f1["age"]   # delitem!
print(f1.__dict__)  # {}

四、__str__()方法

print对象,实际是调用str()函数,进而调用其类的__str__()方法。
如果不重写__str__()方法,则用系统自己写的。

class Foo:def __init__(self):passdef __str__(self):return "output me!"f1 = Foo()
print(f1)   # output me!
print(str(f1))  # output me!
print(f1.__str__()) # output me!

五、__repr__()方法

在交互式解释器中执行代码,会触发repr()函数,调用__repr__()方法。
在非交互式时执行代码,会先去执行__strr__()方法,没有的话,再去执行__repr__()方法。
同样,如果不改写__repr__()方法,则会执行系统自己写的。
此外,__str__()方法和__str__()方法返回的数据类型必须是字符串
交互式:
在这里插入图片描述
非交互式:

class Foo:def __init__(self):pass# def __str__(self):#     return "output str!"def __repr__(self):return "output repr!"f1 = Foo()
print(f1)   # output repr!

六、自定制格式化方法

format()函数实际上就是调用 对象.__format__()

format_dic = {"ymd": "{0.year}{0.month}{0.day}","y-m-d": "{0.year}-{0.month}-{0.day}","y:m:d": "{0.year}:{0.month}:{0.day}"
}
class Date:def __init__(self,year,month,day):self.year = yearself.month = monthself.day = daydef __format__(self, format_spec):if not format_spec or format_spec not in format_dic:format_spec = "ymd"fm = format_dic[format_spec]return fm.format(self)d1 = Date(2024,2,24)print(format(d1))   # 2024224
print(format(d1,"y:m:d"))   # 2024:2:24

七、__slots__属性

__slots__是一个类变量,变量值是列表、元组,也可以是字符串等。
作用:字典会占用大量内存,如果有个属性很少的类,但是有很多实例,可以使用__slots__来减少内存开销。
类中定义了__slots__后,其对应的实例则不会有__dict__属性。

class Foo:__slots__ = ["name","age"]  # 实例只能定义name和age属性f1 = Foo()
f1.name = "CRTao"
f1.age = 18print(f1.name,f1.age)   # CRTao 18
f2 = Foo()
f2.age = 10
print(f1.age ,f2.age)   # 18 10

八、__doc__属性

文档描述信息。不能被子类继承。

class Parent():"我是父类"passclass Child(Parent):passprint(Parent.__doc__)   # 我是父类
print(Child.__doc__)    # None

九、__module__和__class__

from test import Foof1 = Foo()
print(f1.__module__)    # test 显示其类所在模块名
print(f1.__class__) # <class 'test.Foo'> 显示类名'''test.py代码
class Foo:pass
'''

十、析构方法

del 实例 会触发 实例.__del__()
程序运行完毕会自动回收内存,也会触发__del__

class Foo:def __init__(self,name):self.name = namedef __del__(self):print("执行del")f1 = Foo("CRTao")del f1.name # 不会触发__del__方法
print("exc me!")'''
exc me!
执行del
'''

注:在 Python 中,当对象被删除时,解释器会调用对象的 del 方法,但是 del 方法并不负责删除对象,它只是在对象即将被销毁时执行一些清理工作。对象的实际删除是由 Python 的垃圾回收机制完成的,它会在对象没有任何引用时将其从内存中删除。

十一、__call__()方法

对象() 触发执行。

class Foo:def __call__(self, *args, **kwargs):print("实例执行!")f1 = Foo()
f1()    # 实例执行! 触发f1的类下的__call__()方法

一切皆对象,类本质也可以看成对象,而Foo()可以理解为是触发Foo的类(创造类Foo的类)下的__call__()方法。

十二、迭代器协议的进一步理解

class Foo:def __init__(self,n):self.n = ndef __iter__(self):return selfdef __next__(self):if self.n > 20:raise StopIteration('终止了')self.n += 1return self.nf1 = Foo(5)for i in f1:    # 先obj=f1.__iter__(),再i=obj.__next__()print(i)

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

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

相关文章

pytorch -- torch.nn下的常用损失函数

1.基础 loss function损失函数&#xff1a;预测输出与实际输出 差距 越小越好 - 计算实际输出和目标之间的差距 - 为我们更新输出提供依据&#xff08;反向传播&#xff09; 1. L1 torch.nn.L1Loss(size_averageNone, reduceNone, reduction‘mean’) 2. 平方差&#xff08;…

如何在 VM 虚拟机中安装 Windows 7 操作系统保姆级教程(附链接)

一、VMware Workstation 虚拟机 没有安装 VM 虚拟机的参考以下文章进行安装&#xff1a; VM 虚拟机安装教程​编辑https://eclecticism.blog.csdn.net/article/details/135713915https://eclecticism.blog.csdn.net/article/details/135713915 二、Windows 7 镜像 点击链接…

C++:类与对象(2)

创作不易&#xff0c;感谢三连&#xff01; 一、六大默认成员函数 C为了弥补C语言的不足&#xff0c;设置了6个默认成员函数 二、构造函数 2.1 概念 在我们学习数据结构的时候&#xff0c;我们总是要在使用一个对象前进行初始化&#xff0c;这似乎已经成为了一件无法改变的…

【论文笔记之 YIN】YIN, a fundamental frequency estimator for speech and music

本文对 Alain de Cheveigne 等人于 2002 年在 The Journal of the Acoustical Society of America 上发表的论文进行简单地翻译。如有表述不当之处欢迎批评指正。欢迎任何形式的转载&#xff0c;但请务必注明出处。 论文链接&#xff1a;http://audition.ens.fr/adc/pdf/2002_…

C# OpenCvSharp 颜色反转

目录 效果 灰度图 黑白色反转 彩色反转 项目 代码 下载 效果 灰度图 黑白色反转 彩色反转 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Te…

电机应用中的大功率电阻器?

在这篇文章中&#xff0c;我们将考虑电机应用中的电阻器。 交流、直流和专用电机用于广泛的应用。一些电机应用相对简单&#xff0c;唯一需要关注的是电机的启动和关闭。在这里&#xff0c;成本、简单性和可靠性是主要问题&#xff0c;而电机控制电阻器是常见的解决方案。 在…

【数据结构】B树,B+树,B*树

文章目录 一、B树1.B树的定义2.B树的插入3.B树的中序遍历 二、B树和B*树1.B树的定义2.B树的插入3.B*树的定义4.B树系列总结 三、B树与B树的应用 一、B树 1.B树的定义 1. 在内存中搜索效率高的数据结构有AVL树&#xff0c;红黑树&#xff0c;哈希表等&#xff0c;但这是在内存…

AutoSAR(基础入门篇)11.5-服务映射(自顶向下)

目录 一、配置Service Needs 二、配置Cfg同步 我们在下一节的实验课中讲解这里的具体配置流程,本节主要讲一下这些配置的大致流程和配置项的作用。NvBlockSwComponents是一个可选项, 我们这里开始不使用NvBlockSwComponents,将我们的Application SWC直接和NvM通过C/S连接起…

C++面试宝典第32题:零钱兑换

题目 给定不同面额的硬币coins和一个总金额amount,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,则返回-1。说明:你可以认为每种硬币的数量是无限的。 示例1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = …

SQL-Labs靶场“29-31”关通关教程

君衍. 一、二十九关 基于错误的WAF单引号注入1、源码分析2、HTTP参数污染3、联合查询注入4、updatexml报错注入 二、三十关 基于错误的WAF双引号注入1、源码分析2、联合查询注入3、updatexml报错注入 三、三十一关 基于错误的WAF双引号括号注入1、源码分析2、联合查询注入3、up…

【JavaEE】_前端使用GET请求的queryString向后端传参

目录 1. GET请求的query string 2. 关于query string的urlencode 1. GET请求的query string 1. 在HttpServletRequest请求中&#xff0c;getParameter方法用于在服务器这边获取到请求中的参数&#xff0c;主要在query string中&#xff1b; query string中的键值对都是程序…

C#中的关键字params的用法

C#中有一个关键字params&#xff0c;它相对于一些主要关键字来说&#xff0c;还算是较为低频的&#xff0c;但也会用到。我们可以了解和学习下。 一、定义及约束 params关键字的作用在于可以让方法参数的数目可变。 params的参数类型必须是一维数组。 一旦在方法加入了para…

C++ list详解以及模拟实现

目录 1.list的使用 1.1list的定义 1.2list的使用 1.3list iterator使用 1.4list capacity 1.5list element access 1.6list增删查改 2.list迭代器失效问题 3.list的模拟实现 1.list的使用 1.1list的定义 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容…

240Hz高刷电竞显示器 - HKC VG253KM

&#x1f389;&#x1f389;&#x1f389; 各位电竞爱好者们&#xff0c;今天给大家带来一款神秘武器&#xff0c;一款能够让你在游戏中大展拳脚的高刷电竞显示器 - HKC VG253KM&#xff01;&#x1f525;&#x1f525;&#x1f525; 这款显示器&#xff0c;哎呀&#xff0c;真…

10分钟快速开始SkyWalking结合Springboot项目

10分钟快速开始SkyWalking结合Springboot项目 实习期间&#xff0c;公司让我去学习一下链路追踪如何集成到Springboot项目中。 为此有两个方案&#xff1a; 1.opentelementryjaegerprometheus opentelementry 收集器收集线上的metrics和traces&#xff0c;然后发送给jaeger和p…

IP对讲终端SV-6002(防水)

SV-6002&#xff08;防水&#xff09;是一款IP对讲终端&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;解码后播放&#xff0c;外部DC12~24V电源供电端子&#xff0c;提供单路2W的音频输出。基于TCP/IP网络通信协议和数字音频技术&#xff0c;…

Vue笔记(一)

常用指令 1.v-show与v-if底层原理的区别 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>创建一个V…

STM32存储左右互搏 QSPI总线FATS文件读写FLASH W25QXX

STM32存储左右互搏 QSPI总线FATS文件读写FLASH W25QXX FLASH是常用的一种非易失存储单元&#xff0c;W25QXX系列Flash有不同容量的型号&#xff0c;如W25Q64的容量为64Mbit&#xff0c;也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库Quad SPI总线实现FATS文件操作W25Q各型号…

第十三天-mysql交互

目录 1.安装MySQL connector 方式1&#xff1a;直接安装 方式2&#xff1a;下载 2.创建链接 3.游标Cursor 4.事务控制 5. 数据库连接池 1. 使用 6.循环执行SQL语句 不了解mysql的可以先了解mysql基础 1.安装MySQL connector 1. MySQL connector 是MySQL官方驱动模块…

jmeter 按线程数阶梯式压测数据库

当前版本&#xff1a; jmeter 5.6.3mysql 5.7.39 简介 JMeter 通过 bzm - Concurrency Thread Group 来实现阶梯式压测&#xff0c;它并不是JMeter的官方插件&#xff0c;而是一种由Blazemeter提供的高级线程组插件。可以在不同的时间内并发执行不同数量的线程&#xff0c;模拟…