面试题系列(三)-- python魔法方法都有哪些?

点击“简说Python”,选择“星标公众号”

福利干货,第一时间送达!

面试题系列(三)-- python魔法方法都有哪些?_第1张图片

@图片自制byunsplash

阅读文本大概需要 5 分钟。

问题:python魔法方法有哪些?

1、__new__、__init__、__del__

关于对象的创建和销毁,这三个魔法方法必须掌握,python中万物皆对象,充分了解一个对象的生命周期,必将加深你对python面向对象的理解

class A(object):
   def __init__(self):
    print("打印self的id,证明此处的self实例和__new__方法返回的实例一致")
    print(id(self))
    print("这是 init 方法")

   def __new__(cls):
    print("这是 new 方法")
    print("打印类的id")
    print(id(cls))
    res = object.__new__(cls)
    print("打印实例的id")
    print(id(res))
     return res

   def __del__(self):
    print("删除实例时候调用__del__方法")

a = A()
del a

打印结果:

说明:

1、a = A( )在创建实例的时候,先执行了__new__方法创建的对象, __new__必须要有返回值,返回实例化出来的实例
2、 __new__至少要有一个参数cls,代表要实例化的类
3、__init__是初始化方法,接收__new__返回的实例,进行属性的设置,从打印结果可以看到,__new__返回的实例id和self的id一致,证明两者为同一个对象
4、代码中del a,删除对象,__del__方法执行,在删除对象时候调用

这是 __new__ 方法
打印类的id
2412783914632
打印__new__方法创建的实例id
2412794409648

打印self的id,证明此处的self实例和__new__方法返回的实例一致
2412794409648
这是 init 方法

删除实例时候调用__del__方法

继续加深理解,__del__方法,如下图,我创建了a实例,并且又b=a,c=a,创建了b和c,我在分别执行del a、del b、del c会不会每次都调用__del__方法?

class A(object):
   def __init__(self):
    print("这是 init 方法")

   def __new__(cls):
    res = object.__new__(cls)
     return res

   def __del__(self):
    print(id(self))
    print("删除实例时候调用__del__方法")

a = A()
print(id(a))
b = a
print(id(b))
c = a
print(id(c))
del a
del b
del c

不跟大家卖关子,下方是打印结果,__init__初始化方法在创建对象时候调用了一次,然后a、b、c三个对象,id一致,为同一个对象,当删除的时候,只调用了一次__del__方法,是在最后删除c的时候调用的


上述结果,是因为python的引用计数机制

1、当有1个变量保存了对象的引用时,此对象的引用计数就会加1
2、当使用del删除变量指向的对象时,如果对象的引用计数不会1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除

--本文完--
640?wx_fmt=png
今日留言主题
说说你看了本文后的感触?
或者一句激励自己的话?
(字数不少于15字)

说明:最近每日留言赠书暂停一段时间
不过,留言打卡30天进福利群
还在继续,等你~

2小时快速掌握Python基础知识要点

完整Python基础知识要点

640?wx_fmt=jpeg
学Python | 聊赚钱

你可能感兴趣的:(面试题系列(三)-- python魔法方法都有哪些?)