zoukankan      html  css  js  c++  java
  • 关于Python的Object继承

    今天在Coding的使用,使用了python的单例模式,发现了一个很有趣的问题。

    class x(object):
    
        __se = None
        a = None
    
        def __new__(cls):
            if cls.__se is None:
                cls.__se = super(x, cls).__new__(cls)
            return cls.__se
    
        def __init__(self):
            print id(self)
    
    if __name__ == '__main__':
        a = x()
        a.a=1
        b = x()
        print b.a

    执行后得出:
    4499205328
    4499205328
    1

    单例模式有效!

    将第一行的class x(object): 改为class x: , 执行结果为

    4467004840
    4467004912
    None

    单例模式无效!

    本来以为python类似于Java的模式,所有的类默认都是派生于object类,即object是’根类’。但事实上不是这样。深入了解了一下才发现。继承于object的类,使用了new-style的对象,反之则使用默认的classic对象。这两种对象的明显区别是classic对象在实例化的时候不会调用__new__方法,而是直接调用__init__方法,所以用__new__方法实现的单例模式是无法在classic对象中实现的。

    吐槽一句:object方法是python在2.2的时候增加的一个特性,本身就是为了解决这个__new__方法的问题,但在2.7还没有将默认继承调整为object,进度真的很慢。相比来说3.x的进步又实在太快了。

  • 相关阅读:
    51nod 1102 面积最大的矩形 (单调栈)
    Loj 6280 数列分块入门 4
    Loj 6279 数列分块入门 3
    python 自己写package 导入 attempted relative import beyond top-level package
    Python __pycache__ 含义
    Hive 中 null 和N 的处理
    【shell】 shell 敏捷开发
    RPC 讲解
    neo4j 应用
    【Linux】 查看CPU占用
  • 原文地址:https://www.cnblogs.com/xiaoleiel/p/8301357.html
Copyright © 2011-2022 走看看