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
__getitem__
 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__是相互依存的
__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'}
__delitem__

__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()
__new__

设计模式小计(单例模式)

  定义:一个类始终只有一个实例

 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
__eq__

__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
__hash__

纸牌方法

 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))
面试题

 

posted @ 2018-01-24 20:42  争-渡  阅读(118)  评论(0)    收藏  举报