python中的单例模式
单例模式是设计模式中的一个非常经典的模式,简单的解释就是一个对象不同名字但是空间是同一个,相当于一个空间两个名字,想要对内容进行修改的时候只需要使用其中一个名字就行,下面是一个简单的例子
# 单例模式
class A:
__dc = False
def __init__(self,name,sex):
self.name = name
self.sex = sex
def __new__(cls, *args, **kwargs):
if cls.__dc:
return cls.__dc
cls.__dc = object.__new__(A)
return cls.__dc
res = A('erg','男')
rex = A('alex','女')
print(rex.name)
print(res.name)
下面是__eq__方法的使用
# __eq__方法的使用
class A:
def __init__(self,name,sex):
self.name = name
self.sex = sex
def __eq__(self, other):
# if self.name == other.name: 注意这里的内容的变化当是dict是比较整个字典
if self.__dict__ == other.__dict__:
return True
else:
return False
#可以定制比较的内容,当没有定义__eq__方法的时候会直接比较两个对象的内存地址
#当实现__eq__方法后就会比较方法内的比较内容
ret1 = A('err','男')
ret2 = A('err','女')
print(ret1 == ret2)
下面是hash函数的使用
# __hash__函数的使用
class A:
def __init__(self,name,sex):
self.name = name
self.sex = sex
def __hash__(self):
return hash(self.name+self.sex)
#当不设这个hash函数的时候想让两个属性相同的对象最后hash的值是相等的是
#不可能的因为hash本身就有随机性,所以我们使用了上述的函数之后就可以达到我们使用的效果
ret1 = A('err','男')
ret2 = A('err','男')
print(hash(ret1))
print(hash(ret2))
rank = [str(i) for i in range(1,11)] + list('JQKA')
print(rank)
下面是set函数搭配hash 函数和__eq__函数的使用去重
请看下面的例子认真阅读
class A:
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
def __hash__(self):
return hash(self.sex+self.name)
def __eq__(self, other):
if self.name == other.name and self.sex == other.sex:
return True
return False
ret1 = A('alex','男',18)
ret2 = A('alex','男',19)
ret = set((ret1,ret2))
print(ret)