python中init,new和call魔法方法的作用和区别

在python中,我们在python的类当中会经常遇到__init__,__new__,__call__等魔法方法。那么这三个有什么作用和区别呢?

  1. __new__:在类当中构造实例化对象,并将对象传递给到init,python解释器会提供一个cls。在整个类当中先执行此方法。

1.1__new__:

class B:
    def __new__(cls, *args, **kwargs):
        print("new")
        return super().__new__(cls)

    def __init__(self, name):
        print("init")
        self.name = name

    def foo(self):
        print("__foo__")

b = B('shao')
b.foo()   
# 打印结果:
#  new
#  init
#  __foo__

  上述结果中,很清晰地说明了,执行类B,会先执行new方法,然后才去执行init方法。在应用中,可以通过重写new方法,来实现单例模式:实例化对象只有一个。

1.2实现单例模式:

class A(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance= super().__new__(cls)
        return cls._instance

    def __init__(self,name):
        self.name = name
        print("__init__{}".format(self.name))

    def foo(self):
        print("__foo__")

a = A('bruce')
b = A('bruce')
print(a,id(a))
print(b,id(b))

 

  2.__init__:在类中对实例化对象进行初始化。

2.1__init__:

class C:
    def __init__(self,name):
        self.name = name

    def foo(self):
        print('我是{}'.format(self.name))

c = C('bruce')
c.foo() 
# 我是bruce

  

  3.__call__:在类中,允许创建可调用的对象(实例)。就是说可以让函数(方法)可以像对象一样被调用。以“对象名()”的形式使用。

3.1__call__:

class B:
    def __call__(self, name, add):
        print('{}在调用__call__方法,添加了{}!'.format(name,add))


b = B()
b('bruce','吃饭')  # 实例化对象()   直接调用call方法
# bruce在调用__call__方法,添加了吃饭!

  上述就是,以上三个魔法方法区别和运用。

 

posted on 2022-10-14 09:36  一先生94  阅读(197)  评论(0编辑  收藏  举报

导航