Python魔法方法中__new__()函数的理解,配合小甲鱼的例子的理解

Python中__new__函数的理解

在小甲鱼的课程里,学到了__new__函数的时候,我刚看完他的例子,我是一脸懵逼啊,一点都没有头绪,为啥这样做?在看了几篇博客以后我稍有理解,在这里记录一下

new 是在一个对象实例化的时候所调用的第一个方法。它跟其他魔法方法不同,它的第一个参数不是 self 而是这个类(cls),而其他的参数会直接传递给 init 方法的。

个人理解:new方法是会在init方法前调用的,除了第一个参数,其他参数会返回给init

class Do (str): #继承str的方法
    def __new__(cls,itstr): #调用__new__函数,传入字符串itstr
        itstr = itstr.upper() # 把每个字母大写
        return str.__new__(cls,itstr) #返回实例对象给__init__函数
d = Do('AbcDeFg') #创建实例对象
print(d)

创建实例对象d的时候,本来是调用init函数的
但是由于我们重写了new函数,所以在调用init函数之前会先调用new函数
我们重写的new函数第二个参数是itstr,但是我们还要加工后再返回给init
所以在加工完后return里写str.__new__(cls,itstr)重新调用new函数后把加工后的itstr返回给init函数
所以在调用完了new后开始调用init时,init收到的参数是加工后的itstr,所以d的值就是“ABCDEFG”了

利用这个特点,我们可以在实例化初始化之前对传入的参数进行修改计算,修改以后再传给init,通熟的说就是“掉包”,例如

class Do(float): # 继承浮点数的方法
        def __new__(cls, num): # 传入参数num
            return float.__new__(cls, num*1.5) # 对num加工后返回给init
print(Do(12))

Python魔法方法中__new__()函数的理解,配合小甲鱼的例子的理解_第1张图片

你可能感兴趣的:(python,python,类,字符串)