魔法方法是面向对象的python 的一切, 如果你不知道魔法方法, 说明你还没意识到面向对象的python强大,
魔法方法总是能在适当的时候被调用
init(self[,…])
init 返回的值一定是 数值类型的, 如果返回 字符串等 其他类型的会给你报错
现在 代码对init 进行了重写, 根据需求需要传入2个参数,, 默认原来init 只接受1个参数, 在对init 进行重写的 在内 不要书写 return 返回 任何数据
在什么时候需要重写? 在需要对数据的对象初始化的时候,才会重写这个下划线的init方法
# 需求: 我需要求面积 和周长
class Recycle:
def __init__(self,x,y): # __init__的方法返回值一定是 num 数字型的类型
self.x = x
self.y = y
def getzhou(self):
return (self.x + self.y) * 2
def getMian(self):
return self.x * self.y
c1 = Recycle(10,2)
print(c1.getzhou())
print(c1.getMian())
-----------------------------------------
24
20
=========================报错
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方法, 我被调用了
>>>