首页 > 编程语言 >Python类中__del__()、__call__()、__repr__()、__new__()、__hash__()方法

Python类中__del__()、__call__()、__repr__()、__new__()、__hash__()方法

时间:2024-08-10 19:07:57浏览次数:11  
标签:__ hash Python self -- print def

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

标签:__,hash,Python,self,--,print,def
From: https://www.cnblogs.com/python1111/p/18352652

相关文章

  • Python字典的高级用法
    一、collections中defaultdict的使用1.字典的键映射多个值将下面的列表转成字典l=[('a',2),('b',3),('a',1),('b',4),('a',3),('a',1),('b',3)]一个字典就是一个键对应一个单值的映射,而上面的列表中有相同键。如果你想要一个键映射多个值,那么就需要将这多个值放到另外......
  • C-10-快速语法参考-全-
    C#10快速语法参考(全)原文:C#10QuickSyntaxReference协议:CCBY-NC-SA4.0一、你好世界选择IDE要开始用C#编码,你需要一个支持.NET的集成开发环境(IDE),最流行的选择是微软自己的VisualStudio。122自2002年C#1.0首次发布以来,C#语言经历了多次更新。在撰写本......
  • HashMap 中处理哈希冲突,红黑树对于没有实现 Comparable 接口的 Key 处理
    背景:假设有两个对象,分别是stu和teach(都没有实现Comparable接口),将它们添加进去HashMap里,假设这两个对象发生哈希冲突,那么红黑树怎么判断它们谁在左谁在右?依据是什么?​ 当两个对象stu和teach的哈希值相同,且它们没有实现Comparable接口时,Java8的HashMap会使用t......
  • C--编程零基础入门指南-全-
    C#编程零基础入门指南(全)原文:C#ProgrammingforAbsoluteBeginners协议:CCBY-NC-SA4.0一、做好准备亲爱的读者,欢迎您开始学习编程之旅!电脑、平板电脑、手机和许多其他电子设备都是可编程的,会完全按照人类程序员告诉他们的去做。编程是一个完全基于逻辑的世界。在这方面,......
  • IOS-AR-游戏开发入门手册-全-
    IOSAR游戏开发入门手册(全)原文:BeginningiOSARGameDevelopment协议:CCBY-NC-SA4.0一、介绍在本书中,我们将学习如何使用Unity(Unity3D2018,或者更常见的是Unity)的游戏开发软件来创建一个增强现实(或AR)游戏。在这一章中,我们将介绍Unity的下载和安装过程,并了解Un......
  • smbmap报[*] Detected 0 hosts serving SMB
    执行smbmapsmbmap-H{target_ip}显示[*]Detected0hostsservingSMB[*]Closed0connectionsvps连目标机时正常,vps距离目标时延较低抓包显示本机直接syn, syn+ack,第三个包直接rst怀疑是timeout设置问题查看帮助mansmbmap发现可以设置--timeout,默认0.5s......
  • 国内主流大模型的使用感受
    AI大模型火了有一段时间了,截止目前相关公司(软的、硬的)股票都翻了好几倍。国内目前主流的、可供普通用户体验的应该还只有百度公司的文心一言和阿里巴巴的通义千问,以及字节跳动的豆包关于其技术原理等硬核问题,不在本文的讨论范围内。这里主要对文心和通义做个简单的对比,谈谈我对百......
  • 探索-C--高级特性-全-
    探索C#高级特性(全)原文:ExploringAdvancedFeaturesinC#协议:CCBY-NC-SA4.0一、受关注的C#7C#7于2017年3月发布,是VisualStudio2017发布的一部分。如上所述。NETBlog中,C#7专注于数据消费、简化代码和提高性能。C#7最大的特点是元组和模式匹配。使用元......
  • openai 的各个模型比较(关于英语句子解析)
    最近在使用chatgpt帮助学习英语,主要是进行语法分析和难点解释。为了找到最适合的模型,我比较了多个模型的回答。语法分析问题这是我在实际中理解有困难的句子,尽管比较简短,但从内容上理解,它涉及了倒装。各个模型回答gpt-3.-5-turbo-1106是经过微调的3.5-turbogpt-4o-m......
  • SAP 某 ABAP 系统标准类中仅有 5.4% 公有属性被 READ-ONLY 修饰,原因竟然是…
    笔者之前的文章被很多人误解的ABAP关键字:READ-ONLY 发布之后,有朋友询问,SAP标准实现里,对这个READ-ONLY使用的场景多吗?其实这个问题我们可以自己找到答案。思路是选择一个SAP系统,统计出类的总数,这些类总共定义了多少个属性,其中有多少属性,使用了READ-ONLY来修饰。......