python中init,new和call魔法方法的作用和区别
在python中,我们在python的类当中会经常遇到__init__,__new__,__call__等魔法方法。那么这三个有什么作用和区别呢?
- __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__方法,添加了吃饭!
上述就是,以上三个魔法方法区别和运用。