java/python比较学习——由单例模式看创建对象异同点

单例模式,是面向对象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)  # 

最终结果,x是一个Y对象,java是不支持这么玩的。python对创建对象的控制是基于重新定义new方法,并在新定义的new方法中用逻辑实现,在实现过程中还用到了面向对象的继承和多态的原理,相对java的单例实现来讲要复杂一点,但没有改变创建对象的习惯操作。

  • 由上面的分析可以看出:
    python中的__new__+__init__相当于java的构造方法,并且java中这两个是不能拆开的
    python在执行new,真正创建出对象前可以有逻辑,而java做不到这点
    python不能将__new__+__init__私有化,而java可以

你可能感兴趣的:(java/python比较学习——由单例模式看创建对象异同点)