python学习(八)定制类和枚举
`python`定制类主要是实现特定功能,通过在类中定义特定的函数完成特定的功能。
- class Student(object):
- def __init__(self, name):
- self.name =name
- student = Student("lilei")
- print(student)
`实现定制类`
- class Student(object):
- def __init__(self, name):
- self.name = name
- def __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,1
- def __iter__(self):
- return self
- def __next__(self):
- self.a, self.b = self.b, self.a+ self.b
- f self.a > 30:
- raise StopIteration()
- return self.a
打印输出
- for n in Fib():
- print(n)
可以实现`__getitem__`函数,这样就可以按照索引访问类对象中迭代元素了。
- class OddNum(object):
- def __init__(self):
- self.num = -1
- def __iter__(self):
- return self
- def __next__(self):
- self.num = self.num +2
- if self.num > 10:
- raise StopIteration()
- return self.num
- def __getitem__(self,n):
- temp = 1
- for i in range(n):
- temp += 2
- return temp
- for n in OddNum():
- print(n)
- oddnum = OddNum()
- print(oddnum[3])
可以进一步完善OddNum类的`__getitem__`函数,使其支持`切片处理`
- def __getitem__(self, n):
- if isinstance(n ,int):
- temp =1
- for i in range(n):
- temp +=2
- return temp
- if isinstance(n, slice):
- start = n.start
- end = n.stop
- if start is None:
- start = 0
- tempList = []
- temp = 1
- for i in range(end):
- if i >= start:
- temp += 2
- tempList.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.num
- raise 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 = path
- def __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 = path
- def __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 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 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被设定为0
- Mon = 1
- Tue = 2
- Wed = 3
- Thu = 4
- Fri = 5
- Sat = 6
- for name , member in Weekday.__members__.items():
- print(name, '=>', member, ',', member.value)
我的微信公众号:
python学习(八)定制类和枚举的更多相关文章
- Python学习 Part7:类
Python学习 Part7:类 1. 作用域和命名空间 命名空间(namespace)就是一个从名称到对象的映射. 命名空间的一些实例:内置名称集(函数,像abs(),和内置异常名称),一个模块中的 ...
- python学习笔记4_类和更抽象
python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...
- Python面向对象高级编程-__slots__、定制类,枚举
当在类体内定义好各种属性后,外部是可以随便添加属性的,Python中类如何限制实例的属性? Python自带了很多定制类,诸如__slots__,__str__ __slots__ __slots__ ...
- 【Python】__slots__ 、@property、多重继承、定制类、枚举类、元类
__slots__ @property 多重继承 定制类 枚举类 元类 [使用__slots__] 1.动态语言的一个特点就是允许给实例绑定任意的方法和变量,而静态语言(例如Java)必须事先将属性方 ...
- Python基础(定制类)
文章转载自廖雪峰老师Python课程博客,仅供学习参考使用看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道 ...
- python 面向对象九 定制类
一.定制类,实质就是我们自己重写特殊函数 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__l ...
- 【Python学习之七】类和对象
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 一.面向对象编程1.概念(1)面向对象编程(OOP ...
- Python学习笔记 - day7 - 类
类 面向对象最重要的概念就是类(Class)和实例(Instance),比如球类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同.在Python中,定义类 ...
- python学习(十)元类
python 可以通过`type`函数创建类,也可通过type判断数据类型 import socket from io import StringIO import sys class TypeCla ...
随机推荐
- 高可用Kubernetes集群-1. 集群环境
参考文档: 部署kubernetes集群1:https://github.com/opsnull/follow-me-install-kubernetes-cluster 部署kubernetes集群 ...
- openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 四
openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...
- kaldi DNN在线解码 aishell为例
在kaldi 的工具集里有好几个程序可以用于在线识别.这些程序都位在src/onlinebin文件夹里,他们是由src/online文件夹里的文件编译而成(你现在可以用make ext 命令进行编译) ...
- zookeeper的选举过程
zookeeper的选举过程大致如下: zookeeper的选举过程,就是选出一个在n/2+1个节点中选出一个节点为主节点的过程.比如,当我们启动一个有5个节点的zookeeper集群的时候.首先启动 ...
- 【java】中缀表达式转后缀表达式 java实现
算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出 ...
- HDU 5646 DZY Loves Partition
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5646 bc:http://bestcoder.hdu.edu.cn/contests/con ...
- android入门 — Activity启动模式
1.standard模式 standard模式是系统的默认启动方式,每次激活Activity都会创建Activity,并放在任务栈中. 系统不会在乎活动是否已经存在于返回栈中,每次启动都会创建该活动的 ...
- caffe环境搭建笔记
首先安装以下库或软件 sudo apt-get install gitsudo apt-get install libprotobuf-dev libleveldb-dev l ...
- Redis的sentinel机制(sentinel节点IP为:192.168.23.10) “哨兵”
万一主节点打击,主从模型将会停止工作,为了解决这个问题,Redis提供了一个sentinel(哨兵),以此来实现主从切换的功能,一旦主节点宕机了,sentinel将会在从节点中挑一个作为主节点.与zo ...
- PAT L1 - 056 猜数字
https://pintia.cn/problem-sets/994805046380707840/problems/994805074646122496 一群人坐在一起,每人猜一个 100 以内的数 ...