定义在class中不需要直接调用,python的某些函数或操作符会自动的调用对应的特殊方法.

1、python中 __str__和__repr__

__str__()用于显示给用户,而__repr__()用于显示给开发人员。__str__是可打印的字符输出,内建str()及print语句

 class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender def __str__(self):
return '(Person: %s, %s)' % (self.name, self.gender) __repr__ = __str__ #直接让repr和str相同 p=Person('chengjiaxing','femail')
print(p) #输出(Person: chengjiaxing, femail)

2、python中 __cmp__

为了对对象进行排序,可以使用函数sorted函数,前提是设置了类的__cmp__方法。

 class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def __str__(self):
return '(%s: %s)' % (self.name, self.score)
__repr__ = __str__ def __cmp__(self, s):
if self.name < s.name:
return -1
elif self.name > s.name:
return 1
else:
return 0 >>> L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 77)]
>>> print sorted(L)
[(Alice: 77), (Bob: 88), (Tim: 99)]

3、python中 __len__

调用len()返回实例的长度.

斐波那契数列是由 0, 1, 1, 2, 3, 5, 8...构成。

请编写一个Fib类,Fib(10)表示数列的前10个元素,print Fib(10) 可以打印出数列的前 10 个元素,len(Fib(10))可以正确返回数列的个数10。

 class Fib(object):
def __init__(self,num):
a,b,L=0,1,[]
for n in range(num):
L.append(a)
a,b=b,a+b
self.numbers=L def __str__(self):
return str(self.numbers) __repr__=__str__ def __len__(self):
return len(self.numbers) f=Fib(10)
print(f)
print(len(f))

4、python中类型转换

 class Rational(object):
def __init__(self, p, q):
self.p = p
self.q = q def __int__(self):
return self.p //self.q def __float__(self):
return float(self.p) /float(self.q) print(float(Rational(7, 2))) #3.5
print(float(Rational(1, 3)))  #0.3333333333333333
print(int(Rational(7,2)))    #3

5、python中运算符重载

 class Time60(object):
def __init__(self,hr,min):
self.hr=hr
self.min=min def __str__(self):
return '%d:%d'%(self.hr,self.min) def __add__(self,other): #重载 + 操作符
if self.min+other.min >60:
minute=max(self.min,other.min)-min(self.min,other.min)
hr=self.hr+other.hr+1
else:
hr=self.hr+other.hr
minute=self.min+other.min
return self.__class__(hr,minute)
#Time60(hr,minute) def __iadd__(self, other): #重载 += 操作符
if self.min+other.min >60:
self.min=max(self.min,other.min)-min(self.min,other.min)
self.hr=self.hr+other.hr+1
else:
self.hr=self.hr+other.hr
self.min=self.min+other.min
return self __repr__=__str__ mon=Time60(6,54)
tue=Time60(3,47)
print(mon,tue) #6:54 3:47
print(mon+tue) #10:7
mon+=tue
print(mon) #10:7

转载:https://www.cnblogs.com/oucsheep/p/6711461.html

python用特殊方法定制类(不全)的更多相关文章

  1. Python学习_12_方法和类定制

    方法 在上一篇随笔中,简单提到了类的某些方法:__init__()等的调用,并简要说明方法和函数的区别. 方法是在类内部定义的函数,方法也是对象,所以方法是类的属性,这就是为什么说实例的方法存在于类定 ...

  2. python面向对象高级:定制类

    Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类. 比如: __str__ 与__repr____iter____getitem____call__ __str__ 与__r ...

  3. Python属性、方法和类管理系列之----描述符类

    什么是描述符类? 根据鸭子模型理论,只要具有__get__方法的类就是描述符类. 如果一个类中具有__get__和__set__两个方法,那么就是数据描述符,. 如果一个类中只有__get__方法,那 ...

  4. python特殊方法定制类

    #coding:utf-8class RoundFloat(object): def __init__(self,val): assert isinstance(val, float),"v ...

  5. Python属性、方法和类管理系列之----元类

    元类的介绍 请看位于下面网址的一篇文章,写的相当好. http://blog.jobbole.com/21351/ 实例补充 class Meta(type): def __new__(meta, c ...

  6. Python属性、方法和类管理系列之----属性初探

    在学习dict的时候,肯定听过dict是Python中最重要的数据类型,但是不一定知道为什么.马上你就会明白原因了. Python中从模块.到函数.到类.到元类,其实主要管理方法就是靠一个一个的字典. ...

  7. python中继承、定制类

    2.4python中继承 继承中不要忘了调用super().__init__ def __init__(self,args) super(subclass,self).__init___(args) ...

  8. Python变量、方法、类的命名规则

    1. 变量命名总结: - 1.单下划线开头变量:protected - 2.双下划线开头变量:private - 3.双下划线开头,双下划线结尾:系统内置变量 2. 函数命名总结: - 1.私有方法: ...

  9. Python属性、方法和类管理系列之----__slots__属性

    一句话说明 __slots__是用来限制实例的属性的,__slots__可以规定实例是否应该有__dict__属性:__slots__不能限制类的属性. 只有__slots__列表内的这些变量名可赋值 ...

随机推荐

  1. 25个经典的Spring面试问答

    1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  2. group by having和connect by

    --使用group by 子句对数据进行分组:对group by 子句形成的组运行聚集函数计算每一组的值:最后用having 子句去掉不符合条件的组.--having 子句中的每一个元素也必须出现在s ...

  3. Java GUI编程SwingUtilities.invokeLater作用

    1 http://blog.micxp.com/index.php/archives/109/ 2

  4. 快速自检电脑是否被黑客入侵过(Linux版)

    前言 严谨地说, Linux只是一个内核, `GNU Linux`才算完整的操作系统, 但在本文里还是用通俗的叫法, 把`Ubuntu`,`Debian`,`RedHat`,`CentOS`,`Arc ...

  5. 小白学习HTTPS

    如果你和我一样是HTTPS的小白的话,那就一起来学习这个吧.争取把这篇博客写好,写全面,从原理到实践再到部署. 让我们先来模拟一个场景:当你嗨皮地敲着代码,你的老板偷偷摸摸跑到你的身边,"小 ...

  6. 刷脸支付真的来啦!华为nova3带你玩转酷时代~

    无论是不愿脱离手套的怕冷手. 或是沾满泥土芬芳的勤劳手. 还是挂着水滴的清洁手…… 每当这些时刻,打开支付宝认证支付, 指纹解锁的能力总是光彩尽失. 不过,就在华为nova 3的发布会上, 一项传说已 ...

  7. 【JMeter4.0学习(三)】之SoapUI创建WebService接口模拟服务端以及JMeter对SOAP协议性能测试脚本开发

    目录: 创建WebService接口模拟服务端 下载SoapUI 新建MathUtil.wsdl文件 创建一个SOAP项目 接口模拟服务端配置以及启动 JMeter对SOAP协议性能测试脚本开发 [阐 ...

  8. Linux下SVN安装与权限管理

    cat /etc/redhat-release //查看系统版本号 CentOS release 7.1 (Final) 这里我们採用yum源安装方式: 1.安装svn yum install sub ...

  9. 【BZOJ4004】[JLOI2015]装备购买 贪心+高斯消元

    [BZOJ4004][JLOI2015]装备购买 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 ( ...

  10. intellij idea pycharm phpstorm webstorm 这些编辑器像 sublime text 一样使用 ctrl d 来操作光标多选。

    在Windows 和 Linux 快捷键是 Alt+J,在 Mac OS X 系统下快捷键是 Ctrl+G . 参考 https://blog.jetbrains.com/phpstorm/2014/ ...