【Python047-魔法方法:定制序列】

一、协议是什么

1、协议(protocols)与其他编程语言中的接口很相似,它规定你那些方法必须要定义。然而在Python中协议就显的不那么正式,事实上,在Python中,协议更像是一种指南

2、容器类型的协议

** 如果你希望定制的容器是不可变的话,那你只需要定义__len__(),和__getitem__()方法

** 如果你希望定制的容器是可变的话,那你除了定义__len__() 和__getitem__()方法外,还需要定义__setitem__()和 __delitem__()两个方法

3、容器类型

__len__(self)          定义当被len()调用时的行为(返回容器中元素的个数)

__getitem__(self,key)      定义获取容器中指定元素的行为,相当于self[key]

__setitem__(self,key,value)    定义设置容器中指定元素的行为,相当于self[key] = value

__delitem__(self,key)      定义删除容器中指定元素的行为,相当于del self[key]

__item__(self)          定义当迭代容器中元素的行为

__reversed__(self)          定义当被reversed()调用时的行为

__contains__(self,item)       定义当使用成员测试运算符(in 或 not in)时的行为

魔法方法详解:https://fishc.com.cn/thread-48793-1-2.html

二、 编写一个不可改变的自定义列表,要求记录列表中每个元素被访问的次数

#定制一个不可改变的列表,并且记录每个元素的访问次数
class CountList:
    def __init__(self,*args):#不知道需要传入多少个参数,那么就设置一个可变的参数集
        self.values = [x for x in args]#列表推导式
        #用列表推导式遍历用户传入的参数并建立一个列表
        #self.value里面的内容是用户传入的参数
        print("self_value++",self.values)
        self.count = {}.fromkeys(range(len(self.values)),0)
        #用fromey()方法建立一个字典,self.count是字典
        #字典的key是self.value的索引,对应的value值分别初始化为0
        print("self.count--",self.count)

    def __len__(self):
        return len(self.values) #当len被调用时,返回了容器中元素的个数

    def __getitem__(self,key):
        #这里用户想要得到某个参数的访问次数,需要传入该参数的索引值
        self.count[key] +=1 #每访问一次key对应的value就记录一次
        return self.values[key]

执行结果:
>>> c1 = CountList(1,3,5,7,9)
self_value++ [1, 3, 5, 7, 9]
self.count-- {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
>>> c1[1]
3
>>> c1.count
{0: 0, 1: 1, 2: 0, 3: 0, 4: 0}
>>> c1[1]
3
>>> c1.count
{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}
>>> c1[1]
3
>>> c1.count
{0: 0, 1: 3, 2: 0, 3: 0, 4: 0}

‘‘‘
|-- 由打印出来的结果:
|-- self_value++ [1, 3, 5, 7, 9]
|-- self.count-- {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
|-- 可以得知,列表里面放的是传入的参数,只不过是已列表推导式形成一个列表,字典里面放的是列表的索引以及访问列表内属性的次数,默认为0
|-- 采用__len__():当len被调用时,返回了容器中元素的个数
|-- 为了实现每访问一次元素,就使访问的次数叠加1,必须传入字典self.count的key,并且逐步+1:self.count[key] +=1
‘‘‘

  

原文地址:https://www.cnblogs.com/frankruby/p/9992557.html

时间: 2024-08-30 16:53:39

【Python047-魔法方法:定制序列】的相关文章

python魔法方法-自定义序列

自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python 的相关的协议.所谓的协议就是一些约定内容.例如,如果要将一个类要实现迭代,就必须实现两个魔法方法:__iter__.next(python3.x中为__new__).__iter__应该返回一个对象,这个对象必须实现 next 方法,通常返回的是 self 本身.而 next 方法必须在每次调用的时

Python3 魔法方法:定制序列

1.基于序列的三大容器 分别是 列表.元组.字符串 2.协议 python中的协议更像是一种指南,例如鸭子类型,一只鸟像鸭子一样走,像鸭子一样叫,像鸭子一样游然后这只鸟就可以叫做鸭子 3.容器类型的协议 如果希望定制的容器是不可变的,那么只需要定义__len__ 和__getitem__ 方法 如果希望定制的容器是可变的,那么还需要定义 __setitem__ 和__delitem__方法 4.魔法方法 _len__(self) 定义当被 len() 调用时的行为(返回容器中元素的个数) __g

魔法方法之自定义序列

自定义序列 自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 因为如果要定制容器类型的话需要用到这些协议.首先,实现不变容器的话有一个协议:实现不可变容器,你只能定义__len__ 和 __getitem__ (一会会讲更多).可变容器协议则需要所有不可变容器的所有另外还需要 __setitem__ 和 __delitem__ .最终,如果你希望你的对象是可迭代的话,你需要定义 __iter

课时44:魔法方法:简单定制

目录: 一.简单定制 二.课时44课后习题及答案 **************** 一.简单定制 **************** 基本要求:1>> 定制一个计时器的类2>> start和stop方法代表启动计时和停止计时3>> 假设计时器对象t1,print(t1)和直接调用t1均显示结果4>> 当计时器未启动或已经停止计时,调用stop方法会给予温馨的提示5>> 两个计时器对象可以进行相加:t1 + t26>> 只能使用提供的有限

python魔法方法、构造函数、序列与映射、迭代器、生成器

在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法. 构造函数 构造函数不同于普通方法,将在对象创建后自动调用它们.也就是在对象创建完成后,自动会调用__init__方法来初始化. 创建一个构造方法 构造方法传参 >>> class FooBar: def __init__(self,value=42): #默认参数 self.somevar = value >>&g

python魔法方法

Python 魔术方法指南 入门 构造和初始化 构造定制类 用于比较的魔术方法 用于数值处理的魔术方法 表现你的类 控制属性访问 创建定制序列 反射 可以调用的对象 会话管理器 创建描述器对象 持久化对象 总结 附录 介绍 此教程为我的数篇文章中的一个重点.主题是魔术方法. 什么是魔术方法?他们是面向对象的Python的一切.他们是可以给你的类增加”magic”的特殊方法.他们总是被双下划线所包围(e.g. __init__ 或者 __lt__).然而他们的文档却远没有提供应该有的内容.Pyth

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

python魔法方法详解

文章来源:http://blog.csdn.net/koko66/article/details/42709279 据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的. Python 的魔术方法非常强大,然而随之而来的则是责任.了解正确的方法去使