|
|
|
|
|
|
|
[Original]
[Print]
[Top]
|
__new__
__new__是python里object的方法。如果你要重载__new__,那么你需要继承object。
__new__是类方法。他不带self参数。 __new__和__init__是不一样的。__init__带
self参数。所以他是在对象已经被构造好了以后被调用的。而如果你要在对象构造的时候
做一些事情,那么就需要使用__new__。__new__的返回值必须是对象的实例。 __new__一般在
一些模式里非常有用。我们看一个例子。 这个例子是《thinking in python》里的一个Singleton例子
class OnlyOne(object):
class __OnlyOne:
def __init__(self):
self.val = None
def __str__(self):
return ′self′ + self.val
instance = None
def __new__(cls): # __new__ always a classmethod
if not OnlyOne.instance:
OnlyOne.instance = OnlyOne.__OnlyOne()
return OnlyOne.instance
def __getattr__(self, name):
return getattr(self.instance, name)
def __setattr__(self, name):
return setattr(self.instance, name)
x = OnlyOne()
x.val = 'sausage'
print x
y = OnlyOne()
y.val = 'eggs'
print y
z = OnlyOne()
z.val = 'spam'
print z
print x
print y
我们可以看到OnlyOne从object继承而来。 如果你不继承object,那么你的
__new__就不会在构造的时候来调用。
当x = OnlyOne()的时候,其实就是调用__new__(OnlyOne),每次实例化OnlyOne
的时候都会调用。因为他是类方法。 所以这段代码就是利用这个特性来实现Singleton的。
因为不管构造多少对象,都要调用__new__. 那么在OnlyOne里保持一个类的属性, instance.
他代表嵌套的_OnlyOne的实例。 所以,对于他,我们只构造一次。 以后每次构造的时候都是
直接返回这个实例的。所以,在这里, x,y,z 都是同一个实例。这个方法和典型的用C++ 来实现
Singleton的道理是一样的。
|
|
|
[Original]
[Print]
[Top]
|
|
|