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__方法,添加了吃饭!
上述就是,以上三个魔法方法区别和运用。
浙公网安备 33010602011771号