实例化对象是先执行__new__方法,但是类中没有__new__方法,所以先到父类object类中的new方法,开辟一个属于对象的空间,然后再执行init方法
# class Foo: # __instance = None # def __init__(self,name,age): # 初始化方法 # self.name = name # self.age = age # self.lst = [name] # def __new__(cls, *args, **kwargs): # 构造方法 # if cls.__instance is None: # cls.__instance = object.__new__(cls) # return cls.__instance #每次实例化的空间都是同一个空间 # # obj1 = Foo('alex',20) # obj2 = Foo('egon',22) # print(obj1.lst,obj2.lst)
class Staff: def __init__(self,name,sex): self.name = name self.sex = sex def __eq__(self, other): return self.__dict__ == other.__dict__ alex = Staff("alex","男") alex1 = Staff("alex","男") print(alex == alex1) alex3 = Staff("lin","男") print(alex == alex3)
5.__hash__ hash()
每重新执行hash值,hash都会发生变化,但是一次执行的过程中,同一个值对应的hash值是一样的,而字典的查找原理就是利用hash值在一次执行是一样的而快速找到的
set的去重机制
对每一个元素进行hash计算出一个内存地址
# class Foo: # def __len__(self): # return len(self.student) # def __init__(self): # self.name = "骑士计划" # self.course = "python" # self.student = [] # s1 = Foo() # s1.student.append("wuyi") # s1.student.append("lin") # s1.student.append("wang") # print(len(s1)) #3 会执行列中的__len__方法