魔法方法是面向对象的python 的一切, 如果你不知道魔法方法, 说明你还没意识到面向对象的python强大,
魔法方法总是能在适当的时候被调用

init(self[,…])

init 返回的值一定是 数值类型的, 如果返回 字符串等 其他类型的会给你报错
现在 代码对init 进行了重写, 根据需求需要传入2个参数,, 默认原来init 只接受1个参数, 在对init 进行重写的 在内 不要书写 return 返回 任何数据
在什么时候需要重写? 在需要对数据的对象初始化的时候,才会重写这个下划线的init方法

  1. # 需求: 我需要求面积 和周长
  2. class Recycle:
  3. def __init__(self,x,y): # __init__的方法返回值一定是 num 数字型的类型
  4. self.x = x
  5. self.y = y
  6. def getzhou(self):
  7. return (self.x + self.y) * 2
  8. def getMian(self):
  9. return self.x * self.y
  10. c1 = Recycle(10,2)
  11. print(c1.getzhou())
  12. print(c1.getMian())
  13. -----------------------------------------
  14. 24
  15. 20
  16. =========================报错
  17. class B:
  18. def __init__(self):
  19. return "nisdhhhdd"
  20. b1 = B()
  21. -------------------------------
  22. b1 = B()
  23. TypeError: __init__() should return None, not 'str'

new(cls,[, …])

new实列化方法, 是第一个被调用的方法, 比 init 方法还要在前
一般我们不会重写这个方法, 极少的情况下,, 只有 一种情况 我需要对这个new方法进行重写! 是什么呢??
那就是 当你继承一个不可变的类型的时候, 又需要进行修改的时候, 那么new 的特性就显得尤为重要了

str 这个字符串方法本省是不能被修改的,,

在new 之前 对数据 转化完之后 替换后 , 替换之后的 再调用 capStr 的 new

  1. class CapStr(str):
  2. def __new__(cls, string):
  3. string = string.upper()
  4. return str.__new__(cls, string)
  5. c1 = CapStr(' Hello World')
  6. print(c1)
  7. -----------------
  8. HELLO WORLD

del(self)析构器

析构的意思是, 被调用了然后执行里里面的代码!
将对象将要被销毁的时候, python 会自动调用 del 这个方法
但是要注意的是, 当程序中没有任何变量取引用 下划线del 的时候, python的垃圾机制会自动回收 这个下拉线的 del
image.png

  1. # 请使用python 自带的idea 编辑器 来书写, 即可明白原理,
  2. # 类似 vue 中生命周期销毁函数
  3. class Cdel:
  4. def __init__(self):
  5. print("我是ini的方法, 我被调用了")
  6. def __del__(self):
  7. print("我是del方法, 我被调用了")
  8. >>> a = Cdel()
  9. 我是ini的方法, 我被调用了
  10. >>> b = a
  11. >>> c = b
  12. >>> del a
  13. >>> del b
  14. >>> del c
  15. 我是del方法, 我被调用了
  16. >>>