1. 特殊方法汇总列表

 

 

2. 仿集合类

__len__:返回对象的长度

__getitem__:获得某一项的值

__setitem__:设置莫一项的值

__delitem__删除某一项

__contains__:包含某一项

 

实现说明:

1) 模拟一副扑克牌,包含两个类,一个是卡片类(Card),一个是 扑克(PuKe),PuKe类包含52张牌,13个大小(AJQK,2-10),4张花色("redheart", "spades", "diamond", "club").

2) 卡片类包含两个属性,rank(等级)、color(花色),以及重写了__eq__方法,判断卡片的相同性,为后续PuKe类中的__getitem__,__setitem__方法中的判断做铺垫;

3) 实现PuKe中的__len__,__getitem__,__setitem__,__contains__等方法。

代码实现:

Card类代码如下:

class Card:
def __init__(self, rank, color):
self.rank = rank
self.color = color
def __repr__(self):
return "Card rank is %s and color is %s" % (self.rank, self.color) def __eq__(self, other):
if isinstance(other, (tuple, )):
if self.rank == other[0] and self.color == other[1]:
return True
if isinstance(other, (Card,)):
if self.rank == other.rank and self.color == other.color:
return True return False

说明:

1) __init__方法包含两个属性,rank和color

2) 重写__repr__方法,格式化后续的Card类对象的打印信息

3) 重写__eq__方法,只有rank、color两个属性都满足的情况下,才能判断卡片是相同的。

PuKe类的实现:

class PuKe:
ranks = [str(rank) for rank in range(2, 11)] + list("JQKA")
colors = ["redheart", "spades", "diamond", "club"] def __init__(self):
"""
初始化生成牌
"""
self._cards = [Card(rank, color) for rank in PuKe.ranks
for color in PuKe.colors] def __len__(self):
"""
返回一副扑克中牌的张数
:return:
""" return len(self._cards) def __getitem__(self, item):
"""
获得某一张牌
:param item:
:return:
"""
assert item is not None
result = None
if isinstance(item, (int,)):
result = self._cards[item]
elif isinstance(item, (tuple,)):
result = []
for card in self._cards:
if card == item:
return card return result def __setitem__(self, key, value):
"""
设置某一项的值
:param key: rank+color,为一元组
:param value: other rank+color,元组
:return: void
"""
assert key is not None
if not isinstance(key, (tuple,)) or not isinstance(value, (tuple,)):
return
for card in self._cards:
if card == key:
card.rank = value[0]
card.color = value[1]
return
def __contains__(self, item):
"""
判断是否包含一个牌
:param item: 元组
:return:
"""
for card in self._cards:
if card == item:
return True
return False

 

说明:

1) __init__方法,初始化52中卡片

2) __len__方法,返回卡片的数量,肯定等于52

3) 在__getitem__方法的实现中,两种实现方法来获得某一张卡片,一个是根据索引号,一个是根据卡片的rank和color属性来定位一张卡片。

4) __setitem__方法中,key是rank和color的元组,实现卡片的定位

5) __contains__方法,判断卡片是否在扑克牌中。

 

代码测试:

if __name__ == '__main__':

    puke1 = PuKe()
print("一副牌的张数为%d " % len(puke1))
print("牌分别为:")
#循环,同样会调用__getitem__
for card in puke1:
print(card) card5 = puke1[5]
print("第5张牌的rank为%s,花色为:%s" % (card5.rank, card5.color)) cardA = puke1[("A", "spades")]
print("A牌的花色分别为:%s" % cardA.color) print("随机选张牌")
from random import choice # 随机选择,同样会调用__getitem__
card = choice(puke1)
print(card) #会调用__setitem__方法
puke1[("7", "spades")] = ("7", "gagagwer")
#再次打印puke
for card in puke1:
print(card)
#会调用__container__方法
print(("7", "gagagwer") in puke1)

 

总结:循环会调用__getitem__,如果某个对象要能循环,必须具备___getitem__方法

细数Python的特殊方法一:集合类的更多相关文章

  1. 细数Python Flask微信公众号开发中遇到的那些坑

    最近两三个月的时间,断断续续边学边做完成了一个微信公众号页面的开发工作.这是一个快递系统,主要功能有用户管理.寄收件地址管理.用户下单,订单管理,订单查询及一些宣传页面等.本文主要细数下开发过程中遇到 ...

  2. C语言:其他进制数转换为十进制(方法一)

    #include<stdio.h> #include<math.h> #include<string.h> //其他任意进制转换为十进制 int main() { ...

  3. Python笔记·第四章—— 细数Python中的数据类型以及他们的方法

    一.数据类型的种类及主要功能 1.数字类型 数字类型主要是用来计算,它分为整数类型int和浮点类型float 2.布尔类型 布尔类型主要是用于判断,它分为真True和False两种 3.字符串类型 字 ...

  4. 细数Python中的数据类型以及他们的方法

    一.数据类型的种类及主要功能 1.数字类型 数字类型主要是用来计算,它分为整数类型int和浮点类型float 2.布尔类型 布尔类型主要是用于判断,它分为真True和False两种 3.字符串类型 字 ...

  5. python高性能编程方法一

    python高性能编程方法一   阅读 Zen of Python,在Python解析器中输入 import this. 一个犀利的Python新手可能会注意到"解析"一词, 认为 ...

  6. 细数iOS上的那些安全防护

    细数iOS上的那些安全防护  龙磊,黑雪,蒸米 @阿里巴巴移动安全 0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非 ...

  7. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用spring framework的IoC容器功能----->方法一:使用XML文件定义beans之间的依赖注入关系

    XML-based configuration metadata(使用XML文件定义beans之间的依赖注入关系) 第一部分 编程思路概述 step1,在XML文件中定义各个bean之间的依赖关系. ...

  8. 细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一

    细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一(转) ADO.NET Entity Framework        ADO.NET Entity Framework 是微软以 ADO.N ...

  9. JBOSS通过Apache负载均衡方法一:使用mod_jk

    JBOSS通过Apache负载均衡方法一:使用mod_jk   本文第一.二节分别对Linux环境下前端使用Apache以及windows环境下前端使用IIS通过AJP协议和后端的JBOSS通信实现负 ...

随机推荐

  1. Poj2482 Stars in Your Window(扫描线)

    题面 Poj 题解 下面内容引用自"李煜东 <算法竞赛进阶指南>"(对原文略有缩减,侵删): 因为矩形的大小固定,所以矩形可以由它的任意一个顶点唯一确定.我们可以考虑把 ...

  2. 【Bzoj4555】【Luogu P4091】求和(NTT)

    题面 Bzoj Luogu 题解 先来颓柿子 $$ \sum_{i=0}^n\sum_{j=0}^iS(i,j)2^jj! \\ =\sum_{j=0}^n2^jj!\sum_{i=0}^nS(i,j ...

  3. jvm 哪些是不会被gc回收的

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com

  4. 【BZOJ 4567】【SCOI 2016】背单词

    http://www.lydsy.com/JudgeOnline/problem.php?id=4567 贪心. 任何不用第一种情况的方案吃的泡椒数都小于\(n^2\),所以最小泡椒数的方案一定不包含 ...

  5. HDU 2255 奔小康赚大钱(KM算法)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2255 [题目大意] 求最大匹配 [题解] KM模板 [代码] #include <cstdi ...

  6. 求数组的平均值 Exercise07_08

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:求数组的平均值 * */ public class Exercise07_ ...

  7. Problem D: 调用函数,输出Fibonacci数列的m项至n项

    #include<stdio.h> int fib(int n)//定义FIbonacci函数 { int s,i; ||n==) { s=; } else { int s1,s2; s1 ...

  8. 猫、路由器、交换机和PC

    转载:http://duanzw102.blog.163.com/blog/static/161838173201392431722650/ 猫是 modem,是有网络供应商,比如电信公司提供的拨号工 ...

  9. 【mysql】备份篇1:使用系统计划任务+mysqldump 定时备份mysql数据库 不用输入密码自动导出sql文件

    项目部署在服务期上之后,有了新的需求,需要每月定时备份mysql数据库的所有数据! 查找了网上的多篇文章之后,自己又对bat文件中的mysqldump语句进行改进,可以实现了不用输入密码就能自动定时备 ...

  10. Android内存优化14 内存泄漏常见情况5 特殊对象造成的内存泄漏 WebView内存泄漏

    WebView造成内存泄露 关于WebView的内存泄露,因为WebView在加载网页后会长期占用内存而不能被释放,因此我们在Activity销毁后要调用它的destory()方法来销毁它以释放内存. ...