# 1. __getitem__ :
# 可以使用字典的方式调用 一个对象中的属性
# 2. __setitem__ :
# 可以使用字典的方式 创建属性
# 3. __delitem__ :
# 可以使用字典的方式 删除属性
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
def __getitem__(self, item):
if hasattr(self,item):
return self.__dict__[item]
def __setitem__(self, key, value):
print(key,value) # 打印结果:sex 1
self.__dict__[key] = value
def __delitem__(self, key):
del self.__dict__[key]
f = Foo('w',23)
print(f['name']) # 打印结果:w
f['sex'] = '1' # 创建 sex
print(f.__dict__) # 打印结果:{'name': 'w', 'age': 23, 'sex': '1'}
del f['sex']
print(f.__dict__) # 打印结果:{'name': 'w', 'age': 23}
# 4. __new__ :
# 是创建 self 的 方法,参数:cls ,因为 self 还没有被创建出来
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__(A)
return cls.__instance
q = A('q',12)
w = A('w',14)
print(q) # 打印结果:<__main__.A object at 0x00000166DDA1EDA0>
print(w) # 打印结果:<__main__.A object at 0x00000166DDA1EDA0>
# 共用一个内存地址
q.sex = 1
print(w.sex) # 打印结果:1
print(q.name) # 打印结果:w
print(w.name) # 打印结果:w
# 5. __eq__ :
# 比较两个对象的时候,默认比较的是内存地址,
# 如果使用 __eq__ 的时候,就可以修改比较方法,和 返回结果
class Z:
def __init__(self,name,age):
self.name = name
self.age = age
def __eq__(self, other):
print(other.name)
if self.name == other.name: # 如果 两个对象的 name 属性相等的话
return True
else:
return False
z1 = Z('q',21)
z2 = Z('q',43)
print(z1 == z2) # 打印结果:True
# 6. __hash__ : hash()
# 可修改 hash 的判断条件
class S:
def __init__(self, name, age):
self.name = name
self.age = age
def __hash__(self):
return hash(self.name + self.age)
s1 = S('q','12')
s2 = S('q','12')
print(hash(s1)) # 打印结果:-2158189666076496876
print(hash(s2)) # 打印结果:-2158189666076496876
# hash值 一样