什么是魔法方法?
python中像init,call这样双下划线开头的结尾的特殊函数我们统称为魔法方法。
现在来看一下魔法函数中比较重要的两个内置属性
_new__
和__init__
魔法函数区别:
new的功能是在生成对象之前所做的动作.
init是在对象生成之后完善对象的属性
先来看一下Init的情况:
class User:
def __init__(self,name):
self.name=name
print("---init---")
user=User('name')
运行结果:
---init---
可见当创建类对象时候就会直接运行Init方法,无需调用就会执行;
在看一个new的情况:
class User:
def __new__(cls, *args, **kwargs):
print('---new----')
user=User()
运行结果:
---new----
有没有发现当直接创建对象时,new方法也会直接被调用,这个时候我们应该会好奇new和init到底有什么区别呢:我们把两个放在一起对比一下:
class User:
def __new__(cls, *args, **kwargs):
print('---new----')
def __int__(self,name):
print('--init---')
self.name=name
user=User('name')
运行结果:
---new----
运行结果发现:
1.发现好像只执行了new方法,
2.但是只执行New方法,创建对象是传入了属性为何没有报错?new 方法也没有地方接收改属性?
解答下
1.new的功能是在生成对象之前所做的动作,接受的参数是cls 类
2.init是在对象生成之后完善对象的属性 它接受的是self 对象
3.对象生成是在 new 里面 return (返回一个对象)
new的功能是在生成对象之前所做的动作.
class User:
def __new__(cls, *args, **kwargs):
print("new")
def __init__(self,name):
self.name=name
print("init")
print(type(User("jingjing")))
运行结果:
new
<class 'NoneType'>
虽然我们用 User(“body”))实例化了但是打印结果为none type ,根本不是一个对象.
原因是我们在 new 没有返回任何对象. 故称为在实例化对象之前的动作.
对象生成是在 new 里面 return (返回一个对象)
我们在 new 返回一个对象,观察一下:
class User:
def __new__(cls, *args, **kwargs):
print("---new----")
return super().__new__(cls)
def __init__(self,name):
self.name=name
print("---init---")
print(type(User("jingjing")))
运行结果:
---new----
---init---
<class '__main__.User'>
我们调用了 父类的返回对象的方法return. 正如咱们所料 真的可以生成了对象.
有了对象以后 init 该干活了.
init是在对象生成之后完善对象的属性
init这个方法,只要有对象立马就执行.它执行的步骤是:
- new 有两个类型的参数*args, **kwargs ,这个两参数如何用,我已经在getattr已经介绍
不懂得可以翻翻 , args 接受tupe, kwargs 接受 dict ,例如:User(“body”,name=“andy”)
new方法会保存传入参数在 对象里. - 当遇到 init的时候会 把保存数据 传入 init并保存在属性里. 顺序不能变哦
- 当new 保存的数据,加入 intit 没有定义任何属性,会报错的,