28.Python进阶_魔法方法_init和new方法

什么是魔法方法?

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这个方法,只要有对象立马就执行.它执行的步骤是:

  1. new 有两个类型的参数*args, **kwargs ,这个两参数如何用,我已经在getattr已经介绍
    不懂得可以翻翻 , args 接受tupe, kwargs 接受 dict ,例如:User(“body”,name=“andy”)
    new方法会保存传入参数在 对象里.
  2. 当遇到 init的时候会 把保存数据 传入 init并保存在属性里. 顺序不能变哦
  3. 当new 保存的数据,加入 intit 没有定义任何属性,会报错的,
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值