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去重的原理是将内存地址相同的去掉。