python类继承重复_python单例模式,可以继承,不会重复执行初始化函数的版本
网上最长见的版本:
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单例模式,可以继承,不会重复执行初始化函数的版本相关推荐
- python类和对象_Python类和对象
python类和对象 Python is an object-oriented programming language. Python Classes and Objects are the cor ...
- python类与函数编程_Python类三种方法,函数传参,类与实例变量(一)详解
1 Python的函数传递: 首先所有的变量都可以理解为内存中一个对象的'引用' a = 1 def func(a): a = 2 func(a) print(a) # 1 a = 1 def fun ...
- python类的命名空间_Python之关于类变量的两种赋值区别详解
我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = ...
- python类带参数_Python函数参数传递机制(超级详细)
Python中,函数参数由实参传递给形参的过程,是由参数传递机制来控制的.通过学习<Python函数值传递和引用传递>一节我们知道,根据实际参数的类型不同,函数参数的传递方式分为值传递和引 ...
- python秒杀神器苏宁_【Python】[新人贴]苏宁易购免费试用申请一键执行 更新1.1版本...
[Python] 纯文本查看 复制代码# -*- coding: utf-8 -*- # 主题 : 苏宁易购试用申请 # 版本 : 1.2(Python 3) # 时间 : 2019.10.27 # ...
- python 类和对象_Python零基础入门学习33:类与面向对象编程:类的继承
注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性. 本文字数约1300,阅读时间约为3分钟. Python面向对象编程 类的继承机制 如果一个类A继承自另一个类B,就把继承者类A称 ...
- python的继承用法_Python 中的继承之Super用法
以下Copy自官方文档说明,可点击查看官网源文 翻译内容属于德德自译,有不当之处请指正,勿喷... 翻译括弧中是德德自己理解,通过代码验证的,勿喷... super(type[, object-or- ...
- python和表格关系_python – 单表继承上的SQLAlchemy一对多关系...
我之前正在努力解决这个问题.我能够让这种自我指涉关系发挥作用: class Employee(Base): __tablename__ = 'employee' id = Column(Integer ...
- python类的应用_Python · 元类(Meta Class)及其应用
(这里是本章用到的 GitHub 地址)万物皆对象 -- Python 本章所介绍的元类(Meta Class)和之前介绍过的装饰器(Decorator)都是上面这句话的具现,其中装饰器告诉过我们&q ...
最新文章
- Java中的多线程你只要看这一篇就够了
- tabcontainer控件太长_asp.net AjaxControlToolKit--TabContainer控件的介绍
- 九、distinct
- 吴恩达新书《Machine Learning Yearning》手稿完工,现在全集免费下载!(附pdf下载)
- github 思维导图开元软件_Mymind教学系列--Github上的免费且强大思维导图工具-(一)...
- SpringDataRedis的简单案例使用
- wrong ELF class: ELFCLASS64
- 利用组策略进行软件分发
- ValueError: output parameter for reduction operation logical_and has too many dimensions ?
- CBoard项目学习
- vue 富文本编辑器,插件
- 第四章 广告投放系统——数据库设计与实体类
- android 悬浮按钮点击展开动画,android仿微信浮窗的自动贴边可展开悬浮按钮-博客...
- CM311-3_YST_晨星MSO9385_2+8_安卓9.0_TTL免费升级固件
- C++ printf打印二进制,三进制,八进制,十六进制等(利用itoa)
- 路由器下设置局域网电脑共享
- python 字符串前面加 u, r, b的含义
- Excel中身份证号码验证,那些不得不说的事
- html表格中字与字间距如何调整,excel表格字间距怎么调
- 第十一周学习周报(20180514-20180520)
热门文章
- android 屏幕完美适配,Android完美适配不同屏幕
- java8 collect 类型转换_Java 8 新特性 Stream类的collect方法
- 微型计算机原理及应用程序题,郑学坚《微型计算机原理及应用》(第4版)笔记和课后习题详解...
- oracle dump 文件解析,oracle 事件转储udump文件
- mysql中非主键不能自增吗_mysql非主键自增长用法实例分析
- python编程入门与实践_Python编程入门到实践(二)
- 简单java socket_基于Java Socket实现一个简易在线聊天功能(一)
- 粤教版管理计算机中的文件教案,最新粤教版初中信息技术第一册教案(全册).docx...
- mysql消除重复行的关键字_MySQL 消除重复行的一些方法
- 最终幻想4 android,《最终幻想4》安卓版发布:重温那段曲折的冒险故事