75-python-面向对象进阶

# 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值 一样

  

posted @ 2018-11-06 20:09  _Q  阅读(74)  评论(0)    收藏  举报