翼度科技»论坛 编程开发 python 查看内容

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

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
1.__del__()

销毁魔术方法
触发时机:当一个对象在内存中被销毁的时候自动执行
参数:至少有一个 self,
接收对象 返回值:无
作用:在对象销毁的时候做一些操作
注意:程序自动调用此方法,不需要我们手动调用。
  1. class Cat:
  2.     def __init__(self,name):
  3.         print("--init--")
  4.         self.name = name
  5.     def __str__(self):
  6.         print("--str--")
  7.         return self.name
  8.     def __del__(self):
  9.         print("这是del方法")  #对象一旦被销毁,自动触发此方法
  10. cat1 = Cat("Tom")
  11. print(cat1)
  12. print("最后一行代码")
  13. # --init--
  14. # --str--
  15. # Tom
  16. # 最后一行代码
  17. # 这是del方法
复制代码
  1. class Cat:
  2.     def __del__(self):
  3.         print('----del-----')
  4. def func():
  5.     cat = Cat()
  6.     return cat   #即使有返回值,但函数外部没有变量接受,出了函数对象依然会被销毁
  7. ret =func()
  8. print("最后一行代码")
  9. # 最后一行代码
  10. # ----del-----
复制代码
2.__call__()

方法__call__():可以让类的实例具有类似于函数的行为,进一步模糊了函数和对象之间的概念
使用方式:对象后面加括号,触发执行。
即:对象()或者 类()()
  1. class Cat:
  2.     def eat(self):
  3.         print("吃猫粮")
  4.     def __call__(self, *args, **kwargs):
  5.         print("--call方法--")
  6. cat = Cat()
  7. cat.eat()
  8. cat()
  9. Cat()()
  10. # 吃猫粮
  11. # --call方法--
  12. # --call方法--
  13. #__call__方法实现斐波那契  1,1,2,3,5,添加到列表中
  14. class Fib:
  15.     def __call__(self, n):
  16.         self.list = []
  17.         a = 1
  18.         b = 1
  19.         for i in range(1,n+1):
  20.             self.list.append(a)
  21.             a,b = b,a+b
  22.         return self.list
  23. fib =Fib()
  24. print(fib(5))
  25. def fib1(n):
  26.     x=[]
  27.     if n==1 or n==2:
  28.         return 1
  29.     return fib1(n-2)+fib1(n-1)
  30. print(fib1(5))
  31. print(fib1(4))
  32. # [1, 1, 2, 3, 5]
  33. # 5
  34. # 3
复制代码
3.__repr__()

__repr__():改变对象的字符串显示

  • 此方法是 __str__()的备胎,如果找不到__str__()就会找__repr__()方法。
  • %r默认调用的是__repr()方法,如果是字符串会默认加上''
  • repr()方法默认调用__repr__()方法
  1. class Person:
  2.     def __init__(self,name,age):
  3.         self.name = name
  4.         self.age = age
  5.     def __str__(self):
  6.         return str(self.__dict__)
  7.     def __repr__(self):
  8.         return 'name:%s--age:%d'%(self.name,self.age)
  9. per = Person('johnson',18)
  10. print(per)
  11. string ='zhou'
  12. print("大家好,我叫%s"%string)
  13. print("大家好,我叫%r"%string)
  14. # %s 默认调用str方法,%r默认调用repr方法
  15. print("大家好,我叫%r"%per)
  16. print("大家好,我叫%s"%per)
  17. # {'name': 'johnson', 'age': 18}
  18. # 大家好,我叫zhou
  19. # 大家好,我叫'zhou'
  20. # 大家好,我叫name:johnson--age:18
  21. # 大家好,我叫{'name': 'johnson', 'age': 18}
复制代码
4.__new__()方法

触发机制:在实例化对时触发
参数:至少一个cls接收当前类
返回值:必须返回一个对象实例 作用:实例化对象
注意:实例化对象 Object 类底层实现,其他类继承了Object的__new__才能够实例化对象
没事别碰这个魔术方法,先触发__new__()才触发__init__
  1. class Cat:
  2.     def __init__(self):
  3.         print('--init--')
  4.     def __new__(cls, *args, **kwargs):
  5.         print('---new---')
  6.         return object.__new__(cls)  #成功创建了对象,但一出函数对象就被销毁
  7.     def __del__(self):
  8.         print('--del--')
  9.     def __str__(self):
  10.         return '--str--'
  11. def func():
  12.     cat = Cat()
  13.     print(cat)
  14.     return cat
  15. ret = func()
  16. print('最后一行代码------')
  17. # ---new---
  18. # --init--
  19. # --str--
  20. # 最后一行代码------
  21. # --del--
复制代码
  1. class Shopping:
  2.     __instance = None
  3.     def __new__(cls, *args, **kwargs):
  4.         if cls.__instance==None:
  5.             cls.__instance = object.__new__(cls)
  6.             return cls.__instance
  7.         else:
  8.             return cls.__instance
  9. shop1 = Shopping()
  10. shop2 = Shopping()
  11. print(id(shop1),id(shop2))
  12. print(shop1,shop2)
  13. shop3 = Shopping()
  14. print(id(shop3))
  15. # 1395248497888 1395248497888
  16. # <__main__.Shopping object at 0x00000144DB4A84E0> <__main__.Shopping object at 0x00000144DB4A84E0>
  17. # 1395248497888
复制代码
5.__hash__()

哈希(hash)也翻译叫散列。hash算法,是将一个不定长的输入,通过hash函数变换成一个定长的输出,即哈希值
在python中,有内置的哈希函数hash(),返回一个对象(数字、字符串,不能直接用于list,set,dict)的哈希值
  1. set1 ={1,2,3}
  2. dic = {'a':1}
  3. # print({[1]:1}) # TypeError: unhashable type: 'list'
  4. string = 'a'
  5. print(hash(string))
  6. print(hash((1,3)))
  7. # 8878686175204649982
  8. # 3713081631933328131
复制代码
1.自定义对象能不能添加到集合中呢?  能默认调用父类的__hash__和__eq__
2.object的hash值是怎么算的呢?   id是hash的16倍
3.自定义对象添加到集合中,一般认为两个对象的属性值相同就是同一个对象 --自定义计算规则
4.注意:如果只定义了__eq__方法,没有定义__hash__方法,__hash__方法会隐式设置成None
  1. #学习中遇到问题没人解答?小编创建了一个Python学习交流群:531509025
  2. class Person:
  3.     def __init__(self,num):
  4.         self.num = num
  5. p1 =Person(1)
  6. p2 =Person(2)
  7. p3 =Person(3)
  8. list =[p1,p2,p3]
  9. set(list)
  10. print(id(p1))
  11. print(hash(p1))
  12. # 2424376266626597764
  13. # 3713081631933328131
  14. # 2187348381144
  15. # -9223371900145501987
复制代码
  1. class Person:
  2.     def __init__(self,name,age):
  3.         self.name = name
  4.         self.age = age
  5.     def __eq__(self,other):
  6.         print("%s调用了eq方法"%self.name,self.age)
  7.         return self.__dict__==other.__dict__
  8.     def __hash__(self):
  9.         print("%s调用了hash方法"%self.name)
  10.         return hash(self.name)
  11. p1 = Person('johnson',18)
  12. p2 = Person("may",11)
  13. p3 = Person('johnson',18)
  14. print(id(p1),id(p2),id(p3))
  15. set1 = {p1,p2,p3}
  16. print(p1==p3)
  17. # 2744803718088 2744803718032 2744803717976
  18. # johnson调用了hash方法
  19. # may调用了hash方法
  20. # johnson调用了hash方法
  21. # johnson调用了eq方法 18
  22. # johnson调用了eq方法 18
  23. # True
复制代码
来源:https://www.cnblogs.com/python1111/p/18352652
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具