python中的单例模式,hash函数 ,__eq__函数,以及set函数搭配前两个函数去重

这篇博客介绍了Python中单例模式的实现,通过__new__方法确保类只有一个实例。同时,讲解了__eq__方法的用法,用于对象的比较,并提供了一个自定义比较内容的例子。还探讨了__hash__函数,展示了如何根据对象属性生成哈希值,以及在去重场景中与set函数的结合使用。
摘要由CSDN通过智能技术生成

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值