1、python中__str__和repr

如果要把一个类的实例变成 str,就需要实现特殊方法__str__():

class Person(object):def __init__(self, name, gender):self.name = nameself.gender = genderdef __str__(self):return '(Person: %s, %s)' % (self.name, self.gender)

现在,在交互式命令行下用 print 试试:

>>> p = Person('Bob', 'male')
>>> print p
(Person: Bob, male)

但是,如果直接敲变量 p:

>>> p
<main.Person object at 0x10c941890>

似乎__str__() 不会被调用。

因为 Python 定义了__str__()和__repr__()两种方法,__str__()用于显示给用户,而__repr__()用于显示给开发人员,__repr__()是为调试服务的。

有一个偷懒的定义__repr__的方法:

class Person(object):def __init__(self, name, gender):self.name = nameself.gender = genderdef __str__(self):return '(Person: %s, %s)' % (self.name, self.gender)__repr__ = __str__

实例:
class Person(object):def __init__(self, name, gender):self.name = nameself.gender = genderclass Student(Person):def __init__(self, name, gender, score):super(Student, self).__init__(name, gender)self.score = scoredef __str__(self):return '(Student:%s,%s,%d)'%(self.name,self.gender,self.score)s = Student('Bob', 'male', 88)
print (s)

2、python中的__cmp__

对 int、str 等内置数据类型排序时,Python的 sorted() 按照默认的比较函数 cmp 排序,但是,如果对一组 Student 类的实例排序时,就必须提供我们自己的特殊方法 __cmp__():

class Student(object):def __init__(self, name, score):self.name = nameself.score = scoredef __str__(self):return '(%s: %s)' % (self.name, self.score)__repr__ = __str__def __cmp__(self, s):if self.name < s.name:return -1elif self.name > s.name:return 1else:return 0

上述 Student 类实现了__cmp__()方法,__cmp__用实例自身self和传入的实例 s 进行比较,如果 self 应该排在前面,就返回 -1,如果 s 应该排在前面,就返回1,如果两者相当,返回 0。

Student类实现了按name进行排序:

>>> L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 77)]
>>> print sorted(L)
[(Alice: 77), (Bob: 88), (Tim: 99)]

注意: 如果list不仅仅包含 Student 类,则 __cmp__ 可能会报错:

3、python中的__len__

如果一个类表现得像一个list,要获取有多少个元素,就得用 len() 函数。

要让 len() 函数工作正常,类必须提供一个特殊方法__len__(),它返回元素的个数。

例如,我们写一个 Students 类,把名字传进去:

class Students(object):def __init__(self, *args):self.names = argsdef __len__(self):return len(self.names)

只要正确实现了__len__()方法,就可以用len()函数返回Students实例的“长度”:

>>> ss = Students('Bob', 'Alice', 'Tim')
>>> print len(ss)
3

4、python中数学运算

Python 提供的基本数据类型 int、float 可以做整数和浮点的四则运算以及乘方等运算。

但是,四则运算不局限于int和float,还可以是有理数、矩阵等。

要表示有理数,可以用一个Rational类来表示:

class Rational(object):def __init__(self, p, q):self.p = pself.q = q

p、q 都是整数,表示有理数 p/q。

如果要让Rational进行+运算,需要正确实现__add__:

class Rational(object):def __init__(self, p, q):self.p = pself.q = qdef __add__(self, r):return Rational(self.p * r.q + self.q * r.p, self.q * r.q)def __str__(self):return '%s/%s' % (self.p, self.q)__repr__ = __str__

现在可以试试有理数加法:

>>> r1 = Rational(1, 3)
>>> r2 = Rational(1, 2)
>>> print r1 + r2
5/6

5、python中类型转换

Rational类实现了有理数运算,但是,如果要把结果转为 int 或 float 怎么办?

考察整数和浮点数的转换:

>>> int(12.34)
12
>>> float(12)
12.0

如果要把 Rational 转为 int,应该使用:

r = Rational(12, 5)
n = int(r)

要让int()函数正常工作,只需要实现特殊方法__int__():

class Rational(object):def __init__(self, p, q):self.p = pself.q = qdef __int__(self):return self.p // self.q

结果如下:

>>> print int(Rational(7, 2))
3
>>> print int(Rational(1, 3))
0

同理,要让float()函数正常工作,只需要实现特殊方法__float__()。


转载于:https://www.cnblogs.com/Lambda721/p/6132110.html

python中定制类相关推荐

  1. python中定制类_python定制类__str__(实例详解)

    在接下来的文章中,让我们明白什么是python中的自定义类.学习什么是python的自定义类,python定制类可以扮演何种角色在python编程.当你看到像__xxx__ __slots__变量或函 ...

  2. Python 中的类与继承

    类的定义以及实例的建立 Python中,类通过 class 关键字定义. 例如最简单的一个类定义可以为: class Person(object):pass Python 的编程习惯,类名以大写字母开 ...

  3. Python中的类、模块和包究竟是什么?

    Python培训教程:Python中的类.模块和包究竟是什么?在Python和其他编程语言中,都有类似或相同的概念,如对象.类.模块.包,名称都是一样的,只不过会有细微的一些区别,正是因为有这些存在, ...

  4. python中定义类

    3.2. 定义类 Python是完全面向对象的:可以定义自已的类,从自已的或内置类进行继承,然后对生成的类进行实例化. 在Python中定义类很简单:就象定义函数,没有独立的定义接口.只要定义类,然后 ...

  5. python中的类属性和类方法_python面向对象之类属性和类方法的使用和实例

    类属性和类方法 目标 类的结构类属性和实例属性类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 1. 使用面相对象开发,第 1 步 是设计 类 2. 使用 类名() 创建对象,创建对象 的 ...

  6. python中新式类和经典类

    python中的类分为新式类和经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要. Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Pyth ...

  7. python笔记(一)——python中的类及内置函数

    1. python中的类定义很简单,以保留字class开始,后面跟着类名就可以了.当然要记得后面的冒号.最简单的类定义: class Tired:     pass psss表示什么都不作,往前走就是 ...

  8. python中的类的属性是什么_python中类属性和数据属性的解释

    python中的类叫class object,类的实例叫instance object. 类 Class Objects 类拥有两种操作,1.类属性 attribute references 2.实例 ...

  9. python中完整类的定义_详解Python中类的定义与使用

    类顾名思义,就是一类事物.或者叫做实例,它用来描述具有共同特征的一类事物.我们在python中声明类的关键词是class,类还有功能和属性,属性就是这类事物的特征,而功能就是它能做什么,也是就是方法或 ...

  10. python定义一个dog类 类属性有名字毛色体重_全面了解python中的类,对象,方法,属性...

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...

最新文章

  1. centos出现磁盘坏掉,怎么修复和检测。
  2. 大数据WEB阶段 Servlet配置优先级 , Spring容器设置对静态资源放行
  3. 通向架构师的道路(第五天)之tomcat集群-群猫乱舞
  4. subprocess installed post-installation script returned error exit status 127
  5. java日志之slf4j与logback简单使用
  6. 怎样重启计算机来关闭u口,从电脑USB接口吹了一口气结果电脑直接关机,按重启也带不起来了,该怎么办?...
  7. 面板大小调整_3天学会premiere完全自学教程-了解时间轴面板
  8. ERROR: Could not install packages due to an OSError: [Errno 28] 设备上没有空间
  9. JS中如何判断null
  10. 【NCD 2019 B】Let me sleep【边双连通分量缩点、树的直径】
  11. 单片机12864带字库汇编使用教程
  12. debian 网络代理_Debian系统代理服务器安装及配置
  13. 乐橙tp1 html调用,乐橙TP1的妙用
  14. iOS开发音频格式转换
  15. three.js加载和使用纹理-specularMap使用高光贴图创建色彩鲜明的地球(vue中使用three.js77)
  16. 数字电路——流水灯(一)
  17. [转]斗鱼大数据搭建的经验和坑
  18. attactEvent与addEventListener
  19. Redis的基本使用
  20. 【中亦安图】小机上运行Oracle需要注意的进程调度bug(1)

热门文章

  1. 5.3 Seq2seq与 Attention的结合:原理与计算过程
  2. 深度学习:径向基网络(RBF)
  3. 海量数据挖掘MMDS week2: Association Rules关联规则与频繁项集挖掘
  4. ubuntu常见错误及解决
  5. base cap 分布式_分布式系统一致性问题、CAP定律以及 BASE 理论
  6. 数字盲打怎么练_数字键盘区的功能及指法技巧
  7. 力扣-692 前k个高频单词
  8. 蓝桥杯2018年第九届C/C++省赛B组第一题-第几天
  9. Dart中dynamic,var,object三者的区别
  10. 如何下载Visual Studio Code及配置教程