单例模式,是面向对象23种模式中比较简单的一个,几乎每一个程序员都能快速默写这个模式的范例,在此我就省略这个复制粘贴默写的过程了。
单例模式的任务是保证系统运行过程中,只能有一个单例类的对象。而单例模式的核心就是控制创建对象的过程只执行一次。
java中构造方法是创建对象的必经之路。说实话,要不是学习python,用java这么多年我都没想过java中创建对象与构造方法执行的先后顺序,这应该是很正常的,对java程序员来讲执行构造方法就是创建对象,创建对象就是执行构造方法,两者是等价的。java对创建对象的控制是用私有化构造方法,并开放静态方法获取实例实现的。
python中有两个方法与创建对象有关,一个是__init__,另一个是__new__。毫无疑问,new是创建对象,而init是初始化对象。需要特别注意的是,new是需要返回值的,而返回的这个值就是创建出来的对象。于是我们可以写出这样的代码:
class X:
def __new__(cls):
return Y()
class Y:
pass
x = X()
t = type(x)
print(t) # <class '__main__.Y'>
最终结果,x是一个Y对象,java是不支持这么玩的。python对创建对象的控制是基于重新定义new方法,并在新定义的new方法中用逻辑实现,在实现过程中还用到了面向对象的继承和多态的原理,相对java的单例实现来讲要复杂一点,但没有改变创建对象的习惯操作。
- 由上面的分析可以看出:
python中的__new__+__init__相当于java的构造方法,并且java中这两个是不能拆开的
python在执行new,真正创建出对象前可以有逻辑,而java做不到这点
python不能将__new__+__init__私有化,而java可以
网友评论