网上最长见的版本:

1 classSingleton(object):2 __instance=None3 def__init__(self):4 pass

5 def__new__(cls,*args,**kwd):6 if Singleton.__instance isNone:7 Singleton.__instance=object.__new__(cls,*args,**kwd)8 return Singleton.__instance

坑1:每次实例化时,__init__()都会执行一次

原因:python每次实力化一个类先调用__new__方法,再调用__init__方法。在__new__方法中,在不让子类有感知的情况下,无法跳过该机制

坑2:该类无法继承,如果有多个类继承了该基类,那么每次实例化不同的类得到的结果都是第一次实例化时得到的类

原因:__instance作为Singleton这个类的类变量存在,当第一次实例化该类的子类时,__instance被设置为实例化的结果,之后实例化每个子类时,在__new__函数中检测到该变量已设置就不会再去实例化,所以该值也就不会变化。

改进:

classSingleton(object):def __new__(cls, *args, **kwargs):if not hasattr(cls, '__instance'):print('in new')

cls.__instance = object.__new__(cls, *args, **kwargs)

cls.__instance.__Singleton_Init__(*args, **kwargs)return cls.__instance

def __Singleton_Init__(self):print("__Singleton_Init__")

填坑1:该类规定子类的初始化函数是__Singleton_Init__,这样就可以在__new__方法中控制初始化方法的调用

填坑2:__new__方法的cls参数是最上的层子类,判断cls.__instance是否被设置就是在判断各个子类是否有__instance成员变量,这样就可以愉快的继承了

再挖个坑:if not hasattr(cls, '__instance'),为什么这里可以检查cls的“私有成员”

一个例子:

#-*- coding: utf-8 -*-

classSingleton(object):def __new__(cls, *args, **kwargs):if not hasattr(cls, '__instance'):print('before new')print(cls)

cls.__instance = object.__new__(cls, *args, **kwargs)print('after new')

cls.__instance.__Singleton_Init__(*args, **kwargs)return cls.__instance

def __init__(self):print("__init__")def __Singleton_Init__(self):print("__Singleton_Init__")classBB(Singleton):pass

classCC(Singleton):passc=CC()

c1=CC()

b=BB()

b.a=2c.a=3

print(id(c), id(c1))print(b.a, c.a)

python类继承重复_python单例模式,可以继承,不会重复执行初始化函数的版本相关推荐

  1. python类和对象_Python类和对象

    python类和对象 Python is an object-oriented programming language. Python Classes and Objects are the cor ...

  2. python类与函数编程_Python类三种方法,函数传参,类与实例变量(一)详解

    1 Python的函数传递: 首先所有的变量都可以理解为内存中一个对象的'引用' a = 1 def func(a): a = 2 func(a) print(a) # 1 a = 1 def fun ...

  3. python类的命名空间_Python之关于类变量的两种赋值区别详解

    我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = ...

  4. python类带参数_Python函数参数传递机制(超级详细)

    Python中,函数参数由实参传递给形参的过程,是由参数传递机制来控制的.通过学习<Python函数值传递和引用传递>一节我们知道,根据实际参数的类型不同,函数参数的传递方式分为值传递和引 ...

  5. python秒杀神器苏宁_【Python】[新人贴]苏宁易购免费试用申请一键执行 更新1.1版本...

    [Python] 纯文本查看 复制代码# -*- coding: utf-8 -*- # 主题 : 苏宁易购试用申请 # 版本 : 1.2(Python 3) # 时间 : 2019.10.27 # ...

  6. python 类和对象_Python零基础入门学习33:类与面向对象编程:类的继承

    注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性. 本文字数约1300,阅读时间约为3分钟. Python面向对象编程 类的继承机制 如果一个类A继承自另一个类B,就把继承者类A称 ...

  7. python的继承用法_Python 中的继承之Super用法

    以下Copy自官方文档说明,可点击查看官网源文 翻译内容属于德德自译,有不当之处请指正,勿喷... 翻译括弧中是德德自己理解,通过代码验证的,勿喷... super(type[, object-or- ...

  8. python和表格关系_python – 单表继承上的SQLAlchemy一对多关系...

    我之前正在努力解决这个问题.我能够让这种自我指涉关系发挥作用: class Employee(Base): __tablename__ = 'employee' id = Column(Integer ...

  9. python类的应用_Python · 元类(Meta Class)及其应用

    (这里是本章用到的 GitHub 地址)万物皆对象 -- Python 本章所介绍的元类(Meta Class)和之前介绍过的装饰器(Decorator)都是上面这句话的具现,其中装饰器告诉过我们&q ...

最新文章

  1. Java中的多线程你只要看这一篇就够了
  2. tabcontainer控件太长_asp.net AjaxControlToolKit--TabContainer控件的介绍
  3. 九、distinct
  4. 吴恩达新书《Machine Learning Yearning》手稿完工,现在全集免费下载!(附pdf下载)
  5. github 思维导图开元软件_Mymind教学系列--Github上的免费且强大思维导图工具-(一)...
  6. SpringDataRedis的简单案例使用
  7. wrong ELF class: ELFCLASS64
  8. 利用组策略进行软件分发
  9. ValueError: output parameter for reduction operation logical_and has too many dimensions ?
  10. CBoard项目学习
  11. vue 富文本编辑器,插件
  12. 第四章 广告投放系统——数据库设计与实体类
  13. android 悬浮按钮点击展开动画,android仿微信浮窗的自动贴边可展开悬浮按钮-博客...
  14. CM311-3_YST_晨星MSO9385_2+8_安卓9.0_TTL免费升级固件
  15. C++ printf打印二进制,三进制,八进制,十六进制等(利用itoa)
  16. 路由器下设置局域网电脑共享
  17. python 字符串前面加 u, r, b的含义
  18. Excel中身份证号码验证,那些不得不说的事
  19. html表格中字与字间距如何调整,excel表格字间距怎么调
  20. 第十一周学习周报(20180514-20180520)

热门文章

  1. android 屏幕完美适配,Android完美适配不同屏幕
  2. java8 collect 类型转换_Java 8 新特性 Stream类的collect方法
  3. 微型计算机原理及应用程序题,郑学坚《微型计算机原理及应用》(第4版)笔记和课后习题详解...
  4. oracle dump 文件解析,oracle 事件转储udump文件
  5. mysql中非主键不能自增吗_mysql非主键自增长用法实例分析
  6. python编程入门与实践_Python编程入门到实践(二)
  7. 简单java socket_基于Java Socket实现一个简易在线聊天功能(一)
  8. 粤教版管理计算机中的文件教案,最新粤教版初中信息技术第一册教案(全册).docx...
  9. mysql消除重复行的关键字_MySQL 消除重复行的一些方法
  10. 最终幻想4 android,《最终幻想4》安卓版发布:重温那段曲折的冒险故事