python单实例

什么是python的单实例?

  在python中如果没有特意指定我们所创建类的基类时,那么所有的类都继承于type这个类的祖宗,所有我们创建的类都是type这个鼻祖的实例。

  例如: 

class A:
    def __init__(self):
            self.welcom = "hello world!"
    def __str__(self):
            return repr(self.welcom)
a = A()
print(a)
这是一个简单的类,在定义的时候没有显示的指定A这个类的基类,所以A这个类默认继承自type这个类。那么类A就是type的实例,
a = A() #a 是A的实例。

那么当我们这么做的时候

b = A()

c = A()

.....时,我们就创建了多个类A的实例出来,那么他们(a,b,c)这些类的实例都是独立的,因为我们没做一次类似d =A()这样的行为时,都会在内存中将上面所编写的这段代码复制一次存放在不同的内存空间,这就表明了它们这些类A的实例之间是没有关联的,谁也影响不到谁,

我们可以验证一下通过以下代码的输出

class A:
    def __init__(self):
            self.welcom = "hello world!"
    def __str__(self):
            return repr(self.welcom)
a = A()
b = A()
c = A()
print(id(a))
print(id(b))
print(id(c))
id(a)是用来输出a这个实例所在的内存空间地址的,可以看到它们所在的内存空间地址是不同的。

那么单实例的概念到此为止就很明显了,就是每当我做一次类似于这样(a=A())的操作的时候,不让我编写的那段代码复制到内存中另一个地址空间去,而是让他们的引用同一段代码,就相当于我定义一个函数

def single():  print("you can reference me !")

a = single
b = single
c = single
print(id(a))
print(id(b))
print(id(c))
当我打印它们在内存中的地址空间的时候,输出的结果是这样的,它们实例化这个函数的时候并没有复制代码到另外的内存空间中去。

那么在定义类的时候怎么做到这样的单实例化一个类呢

def singleton(cls):
    instace = {}
    def getinstance():
        if cls  not in instace:
            instace[cls] = cls()
        return instace[cls]

    return getinstance
class Count:
    def __init__(self):
        self.age = 1
        self.name = ‘zhuwei‘
    def __str__(self):
        return ("name is: %s age is %s " %                                             (self.name,self.age))

Single = singleton(Count)
a = Single()
print(a)
b = Single()
print(b)
print(a is b)
print(id(a))
print(id(b))
print(id(b))
利用闭包(闭包就是在一个函数中嵌套一个或者多个函数,并且这个嵌套的函数可以访问它上级函数的变量,外层函数接受类或者函数作为参数,并且在最后返回嵌套中的函数)的方法实现类的单实例,  
def singleton(cls):
    instace = {}
    def getinstance():
        if cls  not in instace:
            instace[cls] = cls()
        return instace[cls]

    return getinstance
class Count:
    def __init__(self):
        self.age = 1
        self.name = ‘zhuwei‘
    def __str__(self):
        return ("name is: %s age is %s " % (self.name,self.age))

Single = singleton(Count)
a = Single()
print(a)
b = Single()
print(b)
print(a is b)
print(id(a))
print(id(b))
print(id(b))  

这两个类的实例在内存空间中的地址是一样的

利用闭包(闭包就是在一个函数中嵌套一个或者多个函数,并且这个嵌套的函数可以访问它上级函数的变量,外层函数接受类或者函数作为参数,并且在最后返回嵌套中的函数)的方法实现类的单实例,  

还可以利用python中__new__这个魔术方法来实现类的单实例

class SingleTON:
    instace = None
    #def __new__(cls,name,base,dic):
    def __new__(cls,*args,**kwargs):
        if cls.instace is None:
            cls.instace = super(SingleTON,cls).__new__(cls,*args,**kwargs)
        return cls.instace
    def __init__(self):
        self.name = ‘zhuwei‘
a = SingleTON()
b = SingleTON()
print(id(a))
print(id(b))

时间: 2024-07-30 13:48:53

python单实例的相关文章

关于python的单实例模式

单实例模式一直是常用的设计模式,对于python的单实例模式,其实其本身就有实现 http://stackoverflow.com/questions/31875/is-there-a-simple-elegant-way-to-define-singletons-in-python/31887#31887 里面说到module,module只会初始化一次,天然的singleton.这是最为python的解决方案.将你所需要的属性和方法,直接暴露在模块中变成模块的全局变量和方法即可. 另外,如果

python的单实例模式

先看下单实例的定义 这里我们主要学习一下基于模块实现单例对象,这里利用的原理就是python的模块导入的特性,这个模块被第一次导入,会被执行一次,但是如果这个模块被再次导入,无论是在相同的文件还是在不同的文件中,第二次导入都不会再次执行 如果要想通过模块导入实现单实例模式,则必须要在一个文件中定义一个类,这里要切记,在这个文件中一定要实例化这个类,然后在其他文件中导入这个实例对象,那么所有的文件中用的实例对象都是相同的一个 比如我们看下下面的例子 在mysingle.py文件中我们定义了一个类,

python单链表实例分享

有关python单链表的实现代码. 链表的定义:链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列.也就是说,结点包含两部分信息:一部分用于存储数据元素的值,称为信息域:另一部分用于存储下一个数据元素地址的指针,称为指针域.链表中的第一个结点的地址存储在一个单独的结点中,称为头结点或首结点.链表中的最后一个结点没有后继元素,其指针域为空. p

ORACLE11g R2【RAC+ASM→单实例FS】

ORACLE11g R2[RAC+ASM→单实例FS] 11g R2 RAC+ASMà单实例FS的DG,建议禁用OMF. 本演示案例所用环境:   primary standby OS Hostname node1,node2 std OS Version RHEL6.5 RHEL6.5 DB Version 11.2.0.4 11.2.0.4 db_name stephen stephen db_unique_name stephen standby service_names stephen

LB(Load balance)负载均衡集群--{LVS-[NAT+DR]单实例实验+LVS+keeplived实验} 菜鸟入门级

LB(Load balance)负载均衡集群 LVS-[NAT+DR]单实例实验 LVS+keeplived实验 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 逻辑可分为: 1调度层 (Director):它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的. 2[服务器池(server pool)/集群层(Real server)]:是一组真正执行客

ORACLE11g R2【单实例 FS→单实例FS】

ORACLE11g R2[单实例 FS→单实例FS] 本演示案例所用环境:   primary standby OS Hostname pry std OS Version RHEL6.5 RHEL6.5 DB Version 11.2.0.4 11.2.0.4 db_name stephen stephen db_unique_name stephen standby service_names stephen standby instance_name stephen standby Pri

ORACLE10g R2【单实例 FS→单实例FS】

ORACLE10g R2[单实例FS→单实例FS] 本演示案例所用环境:   primary standby OS Hostname pry std OS Version RHEL5.8 RHEL5.8 DB Version 10.2.0.5 10.2.0.5 db_name stephen stephen db_unique_name stephen standby service_names stephen standby instance_name stephen standby Prim

ORACLE10g R2【RAC+ASM→单实例FS】

ORACLE10g R2[RAC+ASM→单实例FS] 10g R2 RAC+ASMà单实例FS的DG,建议禁用OMF. 本演示案例所用环境:   primary standby OS Hostname node1,node2 std OS Version RHEL5.8 RHEL5.8 DB Version 10.2.0.5 10.2.0.5 db_name stephen stephen db_unique_name stephen standby service_names stephen

centos6.5 安装mysql5.6单实例和多实例(单配置文件)

安装mysql 创建mysql用户 useradd mysql              //已经有的不需要创建 卸载原来的mysql  rpm包 rpm -qa|grep mysql  //查询是否有相关包 yum -y remove *mysql*  //我这里用yum卸载的 关闭防火墙,关闭selinux service iptables stop    //个人习惯性关闭防火墙 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/se