python学习(八)定制类和枚举

`python`定制类主要是实现特定功能,通过在类中定义特定的函数完成特定的功能。

class Student(object):def __init__(self, name):self.name =namestudent = Student("lilei")
print(student)

`实现定制类`

class Student(object):def __init__(self, name):self.name = namedef __str__(self):return ("self name is %s" %(self.name))student2 = Student("hanmeimei")
print(student2)

 

实现`__str__`函数,可以在print类对象时打印指定信息

通过实现`__iter__`和`__next__`同样可以使类对象产生可迭代序列,下面实现了`斐波那契数列`

class Fib(object):def __init__(self):self.a , self.b = 0,1def __iter__(self):return selfdef __next__(self):self.a, self.b = self.b, self.a+ self.bf self.a > 30:raise StopIteration()return self.a

打印输出

for n in Fib():print(n)

可以实现`__getitem__`函数,这样就可以按照索引访问类对象中迭代元素了。

class OddNum(object):def __init__(self):self.num = -1def __iter__(self):return selfdef __next__(self):self.num = self.num +2if self.num > 10:raise StopIteration()return self.num def __getitem__(self,n):temp = 1for i in range(n):temp += 2return temp

 

for n in OddNum():print(n)oddnum = OddNum()
print(oddnum[3])

 

 

可以进一步完善OddNum类的`__getitem__`函数,使其支持`切片处理`

def __getitem__(self, n):if isinstance(n ,int):temp =1for i in range(n):temp +=2return tempif isinstance(n, slice):start = n.startend = n.stopif start is None:start = 0tempList = []temp = 1for i in range(end):if i >= start:temp += 2tempList.append(temp)return tempList    

 


`print(oddnum[1:4])`
通过实现`__getattr__`函数,可以在类对象中没有某个属性时,自动调用`__getattr__`函数
实现`__call__`函数,可以实现类对象的函数式调用

def __getattr__(self,attr):if attr == 'name':return 'OddNum'if attr == 'data':return lambda:self.numraise AttributeError('\'OddNum\' object has no attribute \'%s\'' %attr)
def __call__(self):return "My name is OddNum!!"

 



只有在没有找到属性的情况下,才调用`__getattr__`,已有的属性不会在`__getattr__`中查找。

print(oddnum.name)
print(oddnum.data)
#没有func函数会抛出异常
#print(oddnum.func)
#可以直接通过oddnum()函数式调用
print(oddnum())

 


下面是廖雪峰官方网站上的一个链式转化例子,用到了这些特定函数

class Chain(object):def __init__(self, path=''):self.path = pathdef __getattr__(self,attr):return Chain('%s/%s'%(self.path, attr))def users(self, users):return Chain('%s/users/%s' %(self.path, users))def __str__(self):return self.path__repr__ = __str__print(Chain().users('michael').repos)

 

 

class Chain(object):def __init__(self, path=''):self.path = pathdef __getattr__(self,attr):return Chain('%s/%s'%(self.path, attr))def __call__(self, param):return Chain('%s/%s'%(self.path, param))def __str__(self):return self.path__repr__ = __str__print(Chain().get.users('michael').group('doctor').repos)

 

 

python同样支持`枚举`操作

 
from enum import EnumMonth = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))for name, member in Month.__members__.items():print(name, '=>', member, ',', member.value)from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec') )
for name, member in Month.__members__.items():print(name, '=>', member, ',', member.value)from enum import unique
@unique
class Weekday(Enum):Sun = 0 # Sun的value被设定为0Mon = 1Tue = 2Wed = 3Thu = 4Fri = 5Sat = 6for name , member in Weekday.__members__.items():print(name, '=>', member, ',', member.value)
 

 

 

 

我的微信公众号:

 

转载于:https://www.cnblogs.com/secondtonone1/p/7458805.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构实战:(一)Redis采用主从架构的原因

架构实战 (一)Redis采用主从架构的原因 (二) 如果系统的QPS超过10W,甚至是百万以上的访问,则光是Redis是不够的,但是Redis是整个大型缓存架构中,支撑高并发的架构非常重要的环节。 首…

《JavaWeb从入门到改行》注册时向指定邮箱发送邮件激活

javaMail API javaMail是SUN公司提供的针对邮件的API 。 两个jar包 mail.jar 和 activation.jar java mail中主要类:javax.mail.Session、javax.mail.internet.MimeMessage、javax.mail.Transport。 Session 表示会话,即客户端与邮件服务器之…

HTTP之报文

HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP 报文本身是由多行(用 CRLF 作换行符)数据构成的字符串文…

python 内置函数

一 print( ) flush的应用——模拟进度条 import time for i in range(1,101):time.sleep(0.1)print(\r{}%:{}.format(i,**i),end,flushTrue) #\r (return) 表示回车 \n (new line)表示换行,实际上是回车换…

Discuz!论坛实现帖子回复可见内容功能

自从Discuz!升级到3.0以上的时候很多功能都被改版了,已不是2年前的设计,如果不是Discuz!老用户还真不知道怎么玩它了。 博主以前经常逛论坛,但从来没有自己去做过一个论坛,相关的开源程序代码也不是怎么精通…

dropify,不错的图片上传预览插件

引言 传统的图片上传&#xff0c;很丑。点击选择之后&#xff0c;还无法预览。 有一种方案是传到服务器&#xff0c;然后返回地址&#xff0c;然后显示&#xff0c;比较麻烦。 用这个dropify&#xff0c;就可以解决之歌问题。 看效果 用法 1.引入文件,需要jquery支持。 <lin…

【知了堂学习笔记】MySQL数据库常用的SQL语句整理

一&#xff0c;常用、简单的SQL操作语句 1.数据库操作&#xff1a; 1&#xff09;创建数据库&#xff1a; create database database_name&#xff1b; 创建并设置字符编码 create database database_name character set utf8&#xff1b; 2&#xff09;删除数据库&#xff1a…

tomcat原理解析(一):一个简单的实现

一 概述 前段时间去面试&#xff0c;被人问到了tomcat实现原理。由于平时没怎么关注容器的实现细节&#xff0c;这个问题基本没回答上来。所以最近花了很多时间一直在网上找资料和看tomcat的源码来研究里面处理一个HTTP请求的流程。网上讲tomcat的帖子比较多&#xff0c;大多都…

手风琴案例jquery写法

今天我用jquary来写一下手风琴案例&#xff0c;这个案例在平时的项目中很经常会见到&#xff0c;要想实现效果用jquary来写其实很简单&#xff0c;其实一句话就是jquary的方法的调用。 首先我们先来分析一下手风琴案例实际实现的效果&#xff0c;就是点击当前的标题&#xff0c…

元组tuple

另一种有序列表叫元组&#xff1a;tuple。tuple和list非常类似&#xff0c;但是tuple一旦初始化就不能修改&#xff0c;比如同样是列出同学的名字&#xff1a; >>> classmates (Michael, Bob, Tracy)现在&#xff0c;classmates这个tuple不能变了&#xff0c;它也没有…

win7下的nginx小demo

一直大概知道nginx怎么玩,但是不看文档又蒙蔽.在这记录一下,以后好查看 下载tomcat,改index.jsp http://tomcat.apache.org/download-80.cgi tomcat9已经出来了,但是自己用了一次,闪退,换tomcat8,开启成功.(tomcat9这个原因有时间在琢磨) 修改tomcat的index.jsp 然后在index.js…

understand的安装

1.win7 64位下安装 1&#xff09;下载Understand.4.0.908.x64.rar。 2&#xff09;解压之&#xff0c;直接运行里面的Understand-4.0.908-Windows-64bit.exe。 3&#xff09;选择如下 之后&#xff0c;点击“Add Eval or SDL (RegCode)”&#xff0c;如下图&#xff1a; 4&…

条件、循环、函数定义 练习

a.五角星 import turtleturtle.color(yellow)turtle.begin_fill()for i in range(5): turtle.forward(100) turtle.right(144)turtle.end_fill() b.同心圆 import turtlefor i in range(5): turtle.up() turtle.goto(0,-20*(i1)) turtle.down() turtle.circle(20*(i1)) c.太阳花…

2015年上半年 软件设计师 上午试卷 综合知识-2

2015年上半年 软件设计师 上午试卷 综合知识-2 与算术表达式"&#xff08;a&#xff08;b-c&#xff09;&#xff09;*d" 对应的树是&#xff08;21&#xff09;。 答案&#xff1a; B 本题考查程序语言与数据结构基础知识。 对算术表达式"(a(b-c))*d"求…

Python web开发——自定义userprofile(用户描述)

1、新建一个APP 2、查看数据库中系统给我们提供的默认的users的字段含义 ID&#xff1a; 是主键&#xff0c;用户的ID passWord&#xff1a;密码 last_login : 最后一次登录的时间 is_superuser&#xff1a;是否是超级用户&#xff08;VIP&#xff09; username&#xff1a;用户…

Android之View绘制流程开胃菜---setContentView(...)详细分析

版权声明&#xff1a;本文出自汪磊的博客&#xff0c;转载请务必注明出处。 1 为什么要分析setContentView方法 作为安卓开发者相信大部分都有意或者无意看过如下图示&#xff1a;PhoneWindow,DecorView这些究竟都是些神马玩意&#xff1f;图示的层级关系是怎么来的&#xff1f…

排序算法之堆排序

一、什么是堆 如果一个完全二叉树的每个节点&#xff0c;都不大于它的子节点&#xff0c;就可以称之为堆。所谓完全二叉树&#xff0c;就是除了叶子节点以外&#xff0c;所有的其他节点&#xff0c;都有完整的左字树和右子树&#xff0c;除了最后一层的非叶子节点以外。 二、堆…

Codeforces Round #434 (Div. 2)【A、B、C、D】

Codeforces Round #434 (Div. 2) codeforces 858A. k-rounding【水】 题意&#xff1a;已知n和k&#xff0c;求n的最小倍数x&#xff0c;要求x后缀至少有k个0。 题解&#xff1a;答案就是10^k和n的最小公倍数。 1 #include<cstdio>2 #include<cstring>3 #include&l…

PLC与触摸屏练习

电机正反转 触摸屏 要用触摸屏进行仿真是不要忘了先启动梯形图测试 效果 1-2例 行程开关控制的自动循环 梯形图 触摸屏 下面只是用了四个开关&#xff0c;可以根据自己想要实现的按照梯形图添加 题目 梯形图 电动机星三角减压启动控制 题目及要求 触摸屏截图 运算 把显示的数值…

Django里面是文件静态化的方法

看Django官网的时候&#xff0c;由于自己的英语基础较差&#xff0c;而实现的谷歌翻译比较烂&#xff0c;只能看懂个大概。在文件静态化的时候&#xff0c;讲的比较繁琐一点&#xff0c;没怎么看懂&#xff0c;遂询问了一下其他人&#xff0c;明白了许多&#xff0c;但是细节需…