魔法方法是面向对象的python 的一切, 如果你不知道魔法方法, 说明你还没意识到面向对象的python强大,
魔法方法总是能在适当的时候被调用
init(self[,…])
init 返回的值一定是 数值类型的,  如果返回 字符串等 其他类型的会给你报错
现在 代码对init  进行了重写, 根据需求需要传入2个参数,,    默认原来init 只接受1个参数, 在对init 进行重写的 在内 不要书写 return 返回 任何数据
在什么时候需要重写?  在需要对数据的对象初始化的时候,才会重写这个下划线的init方法
# 需求: 我需要求面积 和周长class Recycle:def __init__(self,x,y): # __init__的方法返回值一定是 num 数字型的类型self.x = xself.y = ydef getzhou(self):return (self.x + self.y) * 2def getMian(self):return self.x * self.yc1 = Recycle(10,2)print(c1.getzhou())print(c1.getMian())-----------------------------------------2420=========================报错class B:def __init__(self):return "nisdhhhdd"b1 = B()-------------------------------b1 = B()TypeError: __init__() should return None, not 'str'
new(cls,[, …])
new实列化方法, 是第一个被调用的方法, 比 init 方法还要在前
 一般我们不会重写这个方法, 极少的情况下,,  只有 一种情况 我需要对这个new方法进行重写!   是什么呢??  
 那就是 当你继承一个不可变的类型的时候, 又需要进行修改的时候, 那么new 的特性就显得尤为重要了
str 这个字符串方法本省是不能被修改的,,
在new 之前 对数据 转化完之后 替换后 , 替换之后的 再调用 capStr 的 new
class CapStr(str):def __new__(cls, string):string = string.upper()return str.__new__(cls, string)c1 = CapStr(' Hello World')print(c1)-----------------HELLO WORLD
del(self)析构器
析构的意思是, 被调用了然后执行里里面的代码!
将对象将要被销毁的时候, python 会自动调用  del 这个方法
但是要注意的是,  当程序中没有任何变量取引用  下划线del 的时候, python的垃圾机制会自动回收  这个下拉线的 del 
# 请使用python 自带的idea 编辑器 来书写, 即可明白原理,# 类似 vue 中生命周期销毁函数class Cdel:def __init__(self):print("我是ini的方法, 我被调用了")def __del__(self):print("我是del方法, 我被调用了")>>> a = Cdel()我是ini的方法, 我被调用了>>> b = a>>> c = b>>> del a>>> del b>>> del c我是del方法, 我被调用了>>>
