# ========================= 构造方法 , 析构方法, 初始化 # 构造方法 创建一个对象的 # 初始化方法 __init__ 给已经创建出来的对象添加属性 # 析构方法 删除一个对象的时候调用的方法 # import time # class A: # def __init__(self): # self.f = open('userinfo','a') # def consume(self): # pass # def __del__(self): # '''在删除一个对象之前做一些收尾工作''' # self.f.close() # print('删除一个对象的时候调用我') # # a = A() # time.sleep(1) # del a # # 删除一个对象的时候,如果内部存在__del__方法, # # 那么在删除一个对象之前先执行__del__方法中的代码 # print(a) # ========================= __new__ 构造方法 ===================== # new一个对象 # object.__new__() # class A: # def __init__(self): # print('执行init方法了') # def __new__(cls): # print('执行new方法了') # return object.__new__(cls) # 创造对象,将对象返回 # # a = A() # print(type(a)) # print(type(A)) # 先执行__new__方法 创造出一个对象 # 然后把创造出来的对象传递给__init__方法 # 会把self自动的返回,被a接收 # 元类 # 有一个元类 在创建类 # type() 所有直接用class创建出来的类的元类都是type # class 类名(B,metaclass=type = 元类名) # class 类名(B,metaclass=type) # 默认 # 元类 创造 类 所以所有的类的type都是它的元类,默认是type # 类 创造 对象 具体创造对象的方法 __new__方法,所有的对象的type都是它对应的类 # python中 一切皆对象 # 变量 都有它属于的数据类型 # 设计模式 # 单例模式 # 一个类 可以被多次实例化 但是同一时间在python的内存中,只能有一个实例 # class A: # _instance = None # def __init__(self,name): # '''给娃穿衣服''' # self.name = name # def __new__(cls, *args, **kwargs): # '''生娃的过程''' # if not A._instance: # A._instance = object.__new__(cls) # return A._instance # a1 = A('alex') # 第一次实例化的时候创造一个实例 # print(a1.name) # a2 = A('egon') # print(a1.name,a2.name) # 'alex' 'alex' # class A: # def __init__(self,name): # '''给娃穿衣服''' # self.name = name # def __new__(cls, *args, **kwargs): # '''生娃的过程''' # if not hasattr(A,'_instance'): # A._instance = object.__new__(cls) # return A._instance # a1 = A('alex') # 第一次实例化的时候创造一个实例 # print(a1.name) # a2 = A('egon') # print(a1.name,a2.name) # 'alex' 'alex' # class A: # name = 'Alex' # @classmethod # def func(cls): # pass # A.name = 'Egon' ### = item 系列 # class A: # def __init__(self,name): # self.name = name # self.age = 81 # def __getitem__(self, item): #a["name"] 就是自动调用了getitem 方法 # return self.__dict__[item] # def __setitem__(self, key, value): # 增加一个属性 # self.__dict__[key] = value # def __delitem__(self, key): # 删除一个属性 # del self.__dict__[key] # a = A('alex') # print(a['name']) # 对应了类中一个方法的语法 # a.name # print(a['age']) # 对应了类中一个方法的语法 # a.age # 增加 和 修改一个属性 # a['sex'] = '不详' # # a.sex = '不详' # print(a.__dict__) # # print(a.sex) # # print(a['sex']) # a['sex'] = '女' # print(a.__dict__) # del a['sex'] # print(a.__dict__) # -- call # class A: # def __init__(self,): # print("s") # def __call__(self,a): # print('执行我了',a,) # def call(self,a): # print('执行我了',a,) # a = A()# 执行 # a('aaa') # 执行__call__ # a.call('aaa') # ========== __hash__ # hash # 不可变的数据类型都可以被hash # dic = {"name":"alex"} # class A: # def __hash__(self): # return object.__hash__(self) # a = A() # b = A() # print(hash(dic["name"])) # object.__hash__() # print(hash(a)) # object.__hash__() # print(hash(a)) # object.__hash__() # print(hash(a)) # object.__hash__() # print(hash(a)) # object.__hash__() # print(hash(a)) # object.__hash__() # print(hash(a)) # object.__hash__() # print(hash(b)) # object.__hash__() # dict的key set的元素 # dic key --> value # dic[key] = value # hash(obj)函数,obj对象对应的类必然内部实现了__hash__方法 # hash的结果就是__hash__方法的返回值 # 且在一次成的执行过程中是不会发生变化的 # 且要想作为字典的key或者作为集合的元素,这个对象对应的类必须实现__hash__方法 # 面试题 ### # 金融公司面试题 # 有一个类,对应这个类产生了100个对象 # 每个对象有三个属性 : 姓名 年龄 性别 # 请对这一百个对象进行去重,如果姓名和性别相同,即便年龄不同也是相同的对象 # 问最简便的方法? # class Person: # def __init__(self,name,age,sex): # self.name = name # self.age = age # self.sex = sex # def __hash__(self): # return hash('%s%s'%(self.name,self.sex)) # def __eq__(self, other): # if self.name == other.name and \ # self.sex == other.sex: # return True # p_lst = [] # for i in range(100): # p_lst.append(Person('egon',i,'male')) # p_lst.append(Person('alex',i,'male')) # p_lst.append(Person('yuan',i,'male')) # print(p_lst) # print(set(p_lst)) # 报错不可hash 完成了__hash__ # class Person: # def __init__(self,name,age,sex): # self.name = name # self.age = age # self.sex = sex # def __eq__(self, other): # if self.name == other.name and \ # self.sex == other.sex: # return True # def __hash__(self): # return hash("%s%s"%(self.name,self.sex)) # p_lst = [] # for i in range(100): # p_lst.append(Person("alex",i,"male")) # print(set(p_lst)) # hash是否相等 __hash__ # 值是否相等 __eq__ # 收获1 # 对于一些python当中已经存在的内置函数 内置数据类型 内置模块中的方法 # 都有可能依赖于类中的内置方法 # 收获2 # set方法依赖集合中元素对象的__hash__ __eq__ # = 纸牌实例 # 数据结构与算法 python 数据结构 # python核心编程第二\三版 基础 # 流畅的python 进阶 # from collections import namedtuple # Card = namedtuple('Card',['rank','suit']) # # card1 = Card(1,'红桃') # class FranchDeck: # ranks = [str(n) for n in range(2,11)] + list('JQKA') # suits = ['红心','方板','梅花','黑桃'] # def __init__(self): # self._cards = [Card(rank,suit) for rank in FranchDeck.ranks # for suit in FranchDeck.suits] # def __len__(self): # return len(self._cards) # # def __getitem__(self, item): # return self._cards[item] # # def __setitem__(self, key, value): # self._cards[key] = value # deck = FranchDeck() # print('**',deck[:]) # print(deck.__dict__) # from random import choice # print(choice(deck)) # deck对象对应的类中的getitem方法和len方法 # from random import shuffle # shuffle(deck) # print(deck[:])