Python中的单例设计模式__new__方法和set方法去重写法

当我们创建实例化一个类时,实际上是使用了Object内置的__new__方法。另外,类中的self,就是通过__new__方法创建的。

class A:
      def __new__(self):pass

a=A()

我们可以测试下这个原理:

class B:
    def __init__(self):
        print('我这是一个inti方法')
    def __new__(cls):
        print('我是一个New方法')

b=B()

运行结果:我是一个New方法

 

对于__new__这个方法来讲,我们可以用它来实现单例设计模式:

class A:
    __instance=False
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __new__(cls,*args,**kwargs):
        if cls.__instance:
            return cls.__instance
        cls.__instance=object.__new__(cls)
        return cls.__instance
a=A('fanncy',90)
b=A('json',100)
print(a.name)
print(b.name)

运行结果:json
         json

上面是通过类中去实例化时进行“单例”实现。

还有一种方法是通过set去重办法实现“单例”

例如:如果一个学生的姓名和年龄相同,我们就认为他是同一个人,这在现实当中是非常有用的。我们在实例化这种对象时,随着其他信息的变化, 将会产生越来越多的实例。这是非常可怕的。

代码如下:

class student:
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age
    def __eq__(self,other):
        if self.name==other.name and self.sex==other.sex:
            return True
        return False
    def __hash__(self):
        #根据什么样的属性/内容进行哈希,这里是根据学生的姓名和性别进行哈希
        return hash(self.name+self.sex)

A=student('张三','',17)
B=student('张三','',18)
#要实现set的值,首先要保证这个类是可哈希的,即可实现set方法的调用。
# 故此处没有重新定义__hash__方法,也可以用set方法
#此时打印出来的值是两个地址。没有实现去重。故我们要实现内置方法__eq__
#特别注意要将A,B先组成元组再调用set方法
print(set((A,B)))

运行后发现去重成功。只打印出一个内存地址。
从中我们知道。set去重的原理是将内存地址相同的去掉。

 

posted @ 2019-01-21 09:22  hisweetyGirl  阅读(247)  评论(0编辑  收藏  举报