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))