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

  1. class Student(object):
  2. def __init__(self, name):
  3. self.name =name
  4.  
  5. student = Student("lilei")
  6. print(student)

`实现定制类`

  1. class Student(object):
  2. def __init__(self, name):
  3. self.name = name
  4. def __str__(self):
  5. return ("self name is %s" %(self.name))
  6.  
  7. student2 = Student("hanmeimei")
  8. print(student2)

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

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

  1. class Fib(object):
  2. def __init__(self):
  3. self.a , self.b = 0,1
  4. def __iter__(self):
  5. return self
  6. def __next__(self):
  7. self.a, self.b = self.b, self.a+ self.b
  8. f self.a > 30:
  9. raise StopIteration()
  10. return self.a

打印输出

  1. for n in Fib():
  2. print(n)

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

  1. class OddNum(object):
  2. def __init__(self):
  3. self.num = -1
  4. def __iter__(self):
  5. return self
  6. def __next__(self):
  7. self.num = self.num +2
  8. if self.num > 10:
  9. raise StopIteration()
  10. return self.num
  11.  
  12. def __getitem__(self,n):
  13. temp = 1
  14. for i in range(n):
  15. temp += 2
  16. return temp
  1. for n in OddNum():
  2. print(n)
  3.  
  4. oddnum = OddNum()
  5. print(oddnum[3])

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

  1. def __getitem__(self, n):
  2. if isinstance(n ,int):
  3. temp =1
  4. for i in range(n):
  5. temp +=2
  6. return temp
  7. if isinstance(n, slice):
  8. start = n.start
  9. end = n.stop
  10. if start is None:
  11. start = 0
  12. tempList = []
  13. temp = 1
  14. for i in range(end):
  15. if i >= start:
  16. temp += 2
  17. tempList.append(temp)
  18. return tempList

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

  1. def __getattr__(self,attr):
  2. if attr == 'name':
  3. return 'OddNum'
  4. if attr == 'data':
  5. return lambda:self.num
  6. raise AttributeError('\'OddNum\' object has no attribute \'%s\'' %attr)
  7. def __call__(self):
  8. return "My name is OddNum!!"

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

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

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

  1. class Chain(object):
  2. def __init__(self, path=''):
  3. self.path = path
  4. def __getattr__(self,attr):
  5. return Chain('%s/%s'%(self.path, attr))
  6. def users(self, users):
  7. return Chain('%s/users/%s' %(self.path, users))
  8. def __str__(self):
  9. return self.path
  10. __repr__ = __str__
  11. print(Chain().users('michael').repos)
  1. class Chain(object):
  2. def __init__(self, path=''):
  3. self.path = path
  4. def __getattr__(self,attr):
  5. return Chain('%s/%s'%(self.path, attr))
  6. def __call__(self, param):
  7. return Chain('%s/%s'%(self.path, param))
  8. def __str__(self):
  9. return self.path
  10. __repr__ = __str__
  11.  
  12. print(Chain().get.users('michael').group('doctor').repos)

python同样支持`枚举`操作

  1.  
  1. from enum import Enum
  2.  
  3. Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
  4.  
  5. for name, member in Month.__members__.items():
  6. print(name, '=>', member, ',', member.value)
  7.  
  8. from enum import Enum
  9. Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec') )
  10. for name, member in Month.__members__.items():
  11. print(name, '=>', member, ',', member.value)
  12.  
  13. from enum import unique
  14. @unique
  15. class Weekday(Enum):
  16. Sun = 0 # Sun的value被设定为0
  17. Mon = 1
  18. Tue = 2
  19. Wed = 3
  20. Thu = 4
  21. Fri = 5
  22. Sat = 6
  23.  
  24. for name , member in Weekday.__members__.items():
  25. print(name, '=>', member, ',', member.value)
  1.  
  1.  

我的微信公众号:

python学习(八)定制类和枚举的更多相关文章

  1. Python学习 Part7:类

    Python学习 Part7:类 1. 作用域和命名空间 命名空间(namespace)就是一个从名称到对象的映射. 命名空间的一些实例:内置名称集(函数,像abs(),和内置异常名称),一个模块中的 ...

  2. python学习笔记4_类和更抽象

    python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...

  3. Python面向对象高级编程-__slots__、定制类,枚举

    当在类体内定义好各种属性后,外部是可以随便添加属性的,Python中类如何限制实例的属性? Python自带了很多定制类,诸如__slots__,__str__ __slots__ __slots__ ...

  4. 【Python】__slots__ 、@property、多重继承、定制类、枚举类、元类

    __slots__ @property 多重继承 定制类 枚举类 元类 [使用__slots__] 1.动态语言的一个特点就是允许给实例绑定任意的方法和变量,而静态语言(例如Java)必须事先将属性方 ...

  5. Python基础(定制类)

    文章转载自廖雪峰老师Python课程博客,仅供学习参考使用看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道 ...

  6. python 面向对象九 定制类

    一.定制类,实质就是我们自己重写特殊函数 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__l ...

  7. 【Python学习之七】类和对象

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 一.面向对象编程1.概念(1)面向对象编程(OOP ...

  8. Python学习笔记 - day7 - 类

    类 面向对象最重要的概念就是类(Class)和实例(Instance),比如球类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同.在Python中,定义类 ...

  9. python学习(十)元类

    python 可以通过`type`函数创建类,也可通过type判断数据类型 import socket from io import StringIO import sys class TypeCla ...

随机推荐

  1. 高可用Kubernetes集群-1. 集群环境

    参考文档: 部署kubernetes集群1:https://github.com/opsnull/follow-me-install-kubernetes-cluster 部署kubernetes集群 ...

  2. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 四

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  3. kaldi DNN在线解码 aishell为例

    在kaldi 的工具集里有好几个程序可以用于在线识别.这些程序都位在src/onlinebin文件夹里,他们是由src/online文件夹里的文件编译而成(你现在可以用make ext 命令进行编译) ...

  4. zookeeper的选举过程

    zookeeper的选举过程大致如下: zookeeper的选举过程,就是选出一个在n/2+1个节点中选出一个节点为主节点的过程.比如,当我们启动一个有5个节点的zookeeper集群的时候.首先启动 ...

  5. 【java】中缀表达式转后缀表达式 java实现

    算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出 ...

  6. HDU 5646 DZY Loves Partition

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5646 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  7. android入门 — Activity启动模式

    1.standard模式 standard模式是系统的默认启动方式,每次激活Activity都会创建Activity,并放在任务栈中. 系统不会在乎活动是否已经存在于返回栈中,每次启动都会创建该活动的 ...

  8. caffe环境搭建笔记

    首先安装以下库或软件 sudo apt-get install gitsudo apt-get install      libprotobuf-dev     libleveldb-dev    l ...

  9. Redis的sentinel机制(sentinel节点IP为:192.168.23.10) “哨兵”

    万一主节点打击,主从模型将会停止工作,为了解决这个问题,Redis提供了一个sentinel(哨兵),以此来实现主从切换的功能,一旦主节点宕机了,sentinel将会在从节点中挑一个作为主节点.与zo ...

  10. PAT L1 - 056 猜数字

    https://pintia.cn/problem-sets/994805046380707840/problems/994805074646122496 一群人坐在一起,每人猜一个 100 以内的数 ...