Python基础30(面向对象进阶二)
item系列
 
1 # __getitem__ 2 3 # class Human: 4 # def __init__(self, name, age, sex): 5 # self.name = name 6 # self.age = age 7 # self.sex = sex 8 # def __getitem__(self, item): # 将‘name’拿到item处 9 # if hasattr(self, item): 10 # return self.__dict__[item] 11 # mr = Human('He', 'Twenty-two', 'man') 12 # print(mr['name']) 13 # 结果: He
 
1 # __setitem__ 2 class Human: 3 def __init__(self, name, age, sex): 4 self.name = name 5 self.age = age 6 self.sex = sex 7 8 def __getitem__(self, item): # 将‘name’拿到item上 方法:以字典的形式查询属性及属性值 9 if hasattr(self, item): 10 return self.__dict__[item] 11 def __setitem__(self, key, value): # 增加一种属性,将键'zp'值30拿到key, value上 12 self.__dict__[key] = value 13 14 mr = Human('He', 'Twenty-two', 'man') 15 mr['zp'] = 30 16 17 # print(mr.zp) # 第一表现__setitem__形式 18 # print(mr['zp']) # 第二表现__setitem__形式 19 20 # 结果:30 21 22 # print(mr.__dict__) 23 24 # 结果:{'name': 'He', 'age': 'Twenty-two', 'sex': 'man', 'zp': 30} 25 # 注意__setitem__方法仅是给对象增加了属性,class类中属性不变, 26 # 另__getitem__与 __setitem__是相互依存的
 
# __delitem__ class Human: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def __delitem__(self, key): del self.__dict__[key] mr = Human('He', 'Twenty-two', 'man') del mr.sex # 此为object的原生方法 print(mr.__dict__) # 结果{'name': 'He', 'age': 'Twenty-two'} del mr['age'] # 通过自己定义的方法实现的 print(mr.__dict__) # 结果{'name': 'He'}
__new__方法
 
1 # __new__方法 2 # 构造方法,创造一个函数 3 class Miss(): 4 def __init__(self): 5 print('abc') 6 def __new__(cls, *args, **kwargs): 7 print('123') 8 return object.__new__(Miss, *args, **kwargs) # 使用了object类中的new创建了一个叫做self的对象 9 a = Miss()
设计模式小计(单例模式)
定义:一个类始终只有一个实例
 
1 class Foo: 2 def __init__(self): 3 pass 4 s1 = Foo() 5 s2 = Foo() 6 s3 = Foo() 7 s4 = Foo() 8 print(s1) 9 print(s2) 10 print(s3) 11 print(s4) 12 # 结果: 13 # <__main__.Foo object at 0x039D1250> 14 # <__main__.Foo object at 0x039D1590> 15 # <__main__.Foo object at 0x039D12B0> 16 # <__main__.Foo object at 0x039D1D10> 17 # 一个类可以有无数的对象,占用内存, 18 # 单例模式: 19 # 一个类 始终 只有 一个 实例 20 # 当你第一次实例化这个类的时候 就创建一个实例化的对象 21 # 当你之后再来实例化的时候 就用之前创建的对象
 
1 # 单例函数: 只是在操作一个对象 2 class Foo: 3 __inst = False 4 def __init__(self,name,age): 5 self.name = name 6 self.age = age 7 def __new__(cls, *args, **kwargs): 8 if cls.__inst: 9 return cls.__inst 10 cls.__inst =object.__new__(Foo) 11 return cls.__inst 12 attr = Foo('miss', '18') 13 attr2 = Foo('miss1', '18') 14 attr3 = Foo('miss2', '18') 15 print(attr) 16 print(attr2) 17 print(attr3) 18 # 结果 19 # <__main__.Foo object at 0x03791E10> 20 # <__main__.Foo object at 0x03791E10> 21 # <__main__.Foo object at 0x03791E10> 22 print(attr.name) 23 print(attr2.name) 24 # 结果: 25 # miss2 26 # miss2 27 attr.ak = 123 28 print(attr.ak) 29 print(attr2.ak) 30 # 结果 31 # 123 32 # 123
__eq__方法
 
1 # 2 class A: 3 def __init__(self,name): 4 self.name = name 5 def __eq__(self, other): # 如果不执行__eq__方法,则默认比对内存地址 6 if self.name == other.name: 7 return True 8 else: 9 return False 10 ob1 = A('SB') 11 ob2 = A('SB') 12 print(ob1 == ob2) 13 # 结果 14 # True
__hash__方法
 
1 # __hash__ 2 class A: 3 def __init__(self,name): 4 self.name = name 5 def __hash__(self): #如果没有 __hash__方法,那么哈希值便按内存地址哈希,使用此方法按属性哈希 6 return hash(self.name) 7 agg = A('ss') 8 agg1 = A('ss') 9 print(hash(agg)) 10 print(hash(agg1)) 11 # 结果 12 # -551449695 13 # -551449695
纸牌方法
1 from collections import namedtuple 2 from random import choice 3 from random import shuffle 4 class Poker: 5 card = [str(n) for n in range(2, 11)]+list('JQKA') 6 graphical = ['红桃', '梅花', '方块', '黑桃'] 7 def __init__(self): 8 self.poks = [(graphicals, cards) for graphicals in Poker.graphical for cards in Poker.card] 9 def __len__(self): 10 return len(self.poks) 11 def __getitem__(self, item): # 以字典的方式取牌 12 return self.poks[item] 13 def __setitem__(self, key, value): 14 self.poks[key] = value 15 s = Poker() 16 # print('是否启动抽牌程序(启动Y,终止N)') 17 # while 1: 18 # info = input('Y/N: ') 19 # if info == 'Y': 20 # # print(s[9]) # 取牌 依赖__getitem__方法 21 # print(choice(s), choice(s), choice(s)) # 抽牌方法 依赖__len__方法 22 # elif info == 'N': 23 # print('结束') 24 # break 25 shuffle(s) # 洗牌 依赖 __setitem__方法 26 print(s[:5])
面试题
 
1 class Person: 2 def __init__(self,name,age,sex): 3 self.name = name 4 self.age = age 5 self.sex = sex 6 7 def __hash__(self): 8 return hash(self.name+self.sex) 9 10 def __eq__(self, other): 11 if self.name == other.name and self.sex == other.sex:return True 12 13 14 p_lst = [] 15 for i in range(84): 16 p_lst.append(Person('egon',i,'male')) 17 18 print(p_lst) 19 print(set(p_lst))
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号