item系列
__getitem__
__setitem__
__delitem__
class Foo:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def __getitem__(self,item):
if hasattr(self,item):
return self.__dict__[item]
def __setitem__(self,key,value):
self.__dict__[key] = value
def __delitem__(self,key):
del self.__dict__[key]
f = Foo('egg',38,'不明')
print(f['name']) #调用__getitem__方法
f['hobby'] = '男' #调用__setitem__方法
print(f.hobby,f['hobby'])
del f.hobby #常规方法,对应__delattr__方法,基类里有
del f['hobby'] #调用了__delitem__方法
只要用 []取值的,都是用item系列方法 比如列表元组
##############################################
__new__
__init__是初始化方法,__new__是构造方法,用来创建对象,self就是new造出来的
new先于init执行
设计模式23种
单例模式:一个类始终只有一个实例
之后再实例化的时候,就用第一次创建的对象
class A:
__instance= False
def __init__():
pass
def __new__(cls,*args,**kwargs):
if cls.__instance:
return cls.__instance
cls.__instance = object.__new__(cls,*args,**kwargs)
return cls.__instance
###############################################
__eq__
class A:
def __init__(self,name):
self.name = name
def __eq__(self,other):
if self.name == other.name
return True
else:
return False
a1 = A('egg')
a2 = A('egg')
print(a1 == a2) #没有设置__eq__的话,默认比较内存地址
###########################################
__hash__ #hash()
class A:
def __init__(self,name,sex):
self.name = name
self.sex = sex
def __hash__(self):
retuen hash(self.name + self.sex) #自定义哈希内容
a = A('egg','男')
b = A('egg','女')
print(hash(a))
print(hash(b))