热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python基础30(面向对象进阶二)

item系列1#__getitem__23#classHuman:4#def__init__(self,name,age,sex):5#self.namename6#self.ag

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 = nameself.age = ageself.sex = sexdef __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 # 一个类可以有无数的对象&#xff0c;占用内存&#xff0c;
18 # 单例模式&#xff1a;
19 # 一个类 始终 只有 一个 实例
20 # 当你第一次实例化这个类的时候 就创建一个实例化的对象
21 # 当你之后再来实例化的时候 就用之前创建的对象

前引

1 # 单例函数: 只是在操作一个对象
2 class Foo:
3 __inst &#61; False
4 def __init__(self,name,age):
5 self.name &#61; name
6 self.age &#61; age
7 def __new__(cls, *args, **kwargs):
8 if cls.__inst:
9 return cls.__inst
10 cls.__inst &#61;object.__new__(Foo)
11 return cls.__inst
12 attr &#61; Foo(&#39;miss&#39;, &#39;18&#39;)
13 attr2 &#61; Foo(&#39;miss1&#39;, &#39;18&#39;)
14 attr3 &#61; Foo(&#39;miss2&#39;, &#39;18&#39;)
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 # 结果&#xff1a;
25 # miss2
26 # miss2
27 attr.ak &#61; 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 &#61; name
5 def __eq__(self, other): # 如果不执行__eq__方法&#xff0c;则默认比对内存地址
6 if self.name &#61;&#61; other.name:
7 return True
8 else:
9 return False
10 ob1 &#61; A(&#39;SB&#39;)
11 ob2 &#61; A(&#39;SB&#39;)
12 print(ob1 &#61;&#61; ob2)
13 # 结果
14 # True

__eq__

__hash__方法

1 # __hash__
2 class A:
3 def __init__(self,name):
4 self.name &#61; name
5 def __hash__(self): #如果没有 __hash__方法&#xff0c;那么哈希值便按内存地址哈希&#xff0c;使用此方法按属性哈希
6 return hash(self.name)
7 agg &#61; A(&#39;ss&#39;)
8 agg1 &#61; A(&#39;ss&#39;)
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 &#61; [str(n) for n in range(2, 11)]&#43;list(&#39;JQKA&#39;)
6 graphical &#61; [&#39;红桃&#39;, &#39;梅花&#39;, &#39;方块&#39;, &#39;黑桃&#39;]
7 def __init__(self):
8 self.poks &#61; [(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] &#61; value
15 s &#61; Poker()
16 # print(&#39;是否启动抽牌程序(启动Y&#xff0c;终止N)&#39;)
17 # while 1:
18 # info &#61; input(&#39;Y/N: &#39;)
19 # if info &#61;&#61; &#39;Y&#39;:
20 # # print(s[9]) # 取牌 依赖__getitem__方法
21 # print(choice(s), choice(s), choice(s)) # 抽牌方法 依赖__len__方法
22 # elif info &#61;&#61; &#39;N&#39;:
23 # print(&#39;结束&#39;)
24 # break
25 shuffle(s) # 洗牌 依赖 __setitem__方法
26 print(s[:5])

 面试题

1 class Person:
2 def __init__(self,name,age,sex):
3 self.name &#61; name
4 self.age &#61; age
5 self.sex &#61; sex
6
7 def __hash__(self):
8 return hash(self.name&#43;self.sex)
9
10 def __eq__(self, other):
11 if self.name &#61;&#61; other.name and self.sex &#61;&#61; other.sex:return True
12
13
14 p_lst &#61; []
15 for i in range(84):
16 p_lst.append(Person(&#39;egon&#39;,i,&#39;male&#39;))
17
18 print(p_lst)
19 print(set(p_lst))

面试题

 

转:https://www.cnblogs.com/L5251/articles/8337880.html



推荐阅读
author-avatar
郎嬅不绘画_875
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有