|
发表于 2022-2-23 19:17:18
|
显示全部楼层
本帖最后由 isdkz 于 2022-2-23 19:55 编辑
魔法方法之所以叫魔法方法,就是因为解释器会根据对象的行为去自动调用(万物皆对象,包括类),
而不需要你手动去调用,当然,手动调用也是没问题的,
只不过解释器自动调用也会帮你自动传入一些参数(self,cls),而手动调用需要你自己传入
类在实例化的过程会自动去调用魔法方法 __new__,这个方法会返回一个实例化后的对象,
实例完成后解释器再去调用 __new__ 返回的对象的 __init__ 方法来进行初始化,
这里先提一下工厂函数,跟魔法方法的内容无关
工厂函数,即一个会返回新的对象的函数,实际上工厂函数是一个类,比如 float
调用 __new__ 方法实际上就是实例化,只不过手动调用 __new__ 方法的,只会进行实例化,不会进行初始化,
而由解释器去自动调用的,它在调用完 __new__ 方法后会自动帮你调用 __init__ 方法初始化
- class C2F(float):
- "摄氏度转换为华氏度"
- def __new__(cls, arg=0.0):
- return float.__new__(cls, arg * 1.8 + 32)
- '''
- 这里实际上你用float(arg * 1.8 + 32) 会得到一样的结果,但是它们并不对等,
- 因为 float(arg * 1.8 + 32) 实际经过了两步,
- 第一步,temp = float.__new__(float, arg * 1.8 + 32) (这里为了说明,用了一个临时变量),
- 第二步,temp.__init__(temp, arg * 1.8 + 32),
- 而且使用 float(arg * 1.8 + 32) 由解释器去自动调用 __new__ 和 __init__ 的时候,
- 解释器会在这中间过程会自己传入cls,self,所以其中的cls,self就不由你自己控制了
- '''
复制代码 |
评分
-
查看全部评分
|