首页 > Python资料 博客日记
Python类中__del__()、__call__()、__repr__()、__new__()、__hash__()方法
2024-08-10 19:00:05Python资料围观67次
这篇文章介绍了Python类中__del__()、__call__()、__repr__()、__new__()、__hash__()方法,分享给大家做个参考,收藏Python资料网收获更多编程知识
1.__del__()
销毁魔术方法
触发时机:当一个对象在内存中被销毁的时候自动执行
参数:至少有一个 self,
接收对象 返回值:无
作用:在对象销毁的时候做一些操作
注意:程序自动调用此方法,不需要我们手动调用。
class Cat:
def __init__(self,name):
print("--init--")
self.name = name
def __str__(self):
print("--str--")
return self.name
def __del__(self):
print("这是del方法") #对象一旦被销毁,自动触发此方法
cat1 = Cat("Tom")
print(cat1)
print("最后一行代码")
# --init--
# --str--
# Tom
# 最后一行代码
# 这是del方法
class Cat:
def __del__(self):
print('----del-----')
def func():
cat = Cat()
return cat #即使有返回值,但函数外部没有变量接受,出了函数对象依然会被销毁
ret =func()
print("最后一行代码")
# 最后一行代码
# ----del-----
2.__call__()
方法__call__()
:可以让类的实例具有类似于函数的行为,进一步模糊了函数和对象之间的概念
使用方式:对象后面加括号,触发执行。
即:对象()或者 类()()
class Cat:
def eat(self):
print("吃猫粮")
def __call__(self, *args, **kwargs):
print("--call方法--")
cat = Cat()
cat.eat()
cat()
Cat()()
# 吃猫粮
# --call方法--
# --call方法--
#__call__方法实现斐波那契 1,1,2,3,5,添加到列表中
class Fib:
def __call__(self, n):
self.list = []
a = 1
b = 1
for i in range(1,n+1):
self.list.append(a)
a,b = b,a+b
return self.list
fib =Fib()
print(fib(5))
def fib1(n):
x=[]
if n==1 or n==2:
return 1
return fib1(n-2)+fib1(n-1)
print(fib1(5))
print(fib1(4))
# [1, 1, 2, 3, 5]
# 5
# 3
3.__repr__()
__repr__()
:改变对象的字符串显示
- 此方法是
__str__()
的备胎,如果找不到__str__()
就会找__repr__()
方法。 - %r默认调用的是
__repr()
方法,如果是字符串会默认加上'' - repr()方法默认调用
__repr__()
方法
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return str(self.__dict__)
def __repr__(self):
return 'name:%s--age:%d'%(self.name,self.age)
per = Person('johnson',18)
print(per)
string ='zhou'
print("大家好,我叫%s"%string)
print("大家好,我叫%r"%string)
# %s 默认调用str方法,%r默认调用repr方法
print("大家好,我叫%r"%per)
print("大家好,我叫%s"%per)
# {'name': 'johnson', 'age': 18}
# 大家好,我叫zhou
# 大家好,我叫'zhou'
# 大家好,我叫name:johnson--age:18
# 大家好,我叫{'name': 'johnson', 'age': 18}
4.__new__()
方法
触发机制:在实例化对时触发
参数:至少一个cls接收当前类
返回值:必须返回一个对象实例 作用:实例化对象
注意:实例化对象 Object 类底层实现,其他类继承了Object的__new__
才能够实例化对象
没事别碰这个魔术方法,先触发__new__()
才触发__init__
class Cat:
def __init__(self):
print('--init--')
def __new__(cls, *args, **kwargs):
print('---new---')
return object.__new__(cls) #成功创建了对象,但一出函数对象就被销毁
def __del__(self):
print('--del--')
def __str__(self):
return '--str--'
def func():
cat = Cat()
print(cat)
return cat
ret = func()
print('最后一行代码------')
# ---new---
# --init--
# --str--
# 最后一行代码------
# --del--
class Shopping:
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance==None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance
shop1 = Shopping()
shop2 = Shopping()
print(id(shop1),id(shop2))
print(shop1,shop2)
shop3 = Shopping()
print(id(shop3))
# 1395248497888 1395248497888
# <__main__.Shopping object at 0x00000144DB4A84E0> <__main__.Shopping object at 0x00000144DB4A84E0>
# 1395248497888
5.__hash__()
哈希(hash)也翻译叫散列。hash算法,是将一个不定长的输入,通过hash函数变换成一个定长的输出,即哈希值
在python中,有内置的哈希函数hash(),返回一个对象(数字、字符串,不能直接用于list,set,dict)的哈希值
set1 ={1,2,3}
dic = {'a':1}
# print({[1]:1}) # TypeError: unhashable type: 'list'
string = 'a'
print(hash(string))
print(hash((1,3)))
# 8878686175204649982
# 3713081631933328131
1.自定义对象能不能添加到集合中呢? 能默认调用父类的__hash__
和__eq__
2.object的hash值是怎么算的呢? id是hash的16倍
3.自定义对象添加到集合中,一般认为两个对象的属性值相同就是同一个对象 --自定义计算规则
4.注意:如果只定义了__eq__
方法,没有定义__hash__
方法,__hash__
方法会隐式设置成None
#学习中遇到问题没人解答?小编创建了一个Python学习交流群:531509025
class Person:
def __init__(self,num):
self.num = num
p1 =Person(1)
p2 =Person(2)
p3 =Person(3)
list =[p1,p2,p3]
set(list)
print(id(p1))
print(hash(p1))
# 2424376266626597764
# 3713081631933328131
# 2187348381144
# -9223371900145501987
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __eq__(self,other):
print("%s调用了eq方法"%self.name,self.age)
return self.__dict__==other.__dict__
def __hash__(self):
print("%s调用了hash方法"%self.name)
return hash(self.name)
p1 = Person('johnson',18)
p2 = Person("may",11)
p3 = Person('johnson',18)
print(id(p1),id(p2),id(p3))
set1 = {p1,p2,p3}
print(p1==p3)
# 2744803718088 2744803718032 2744803717976
# johnson调用了hash方法
# may调用了hash方法
# johnson调用了hash方法
# johnson调用了eq方法 18
# johnson调用了eq方法 18
# True
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj