定义在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. poj 1079 Calendar Game(博弈论 SG)

    Calendar Game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  2. Gauge安装

    Gauge系列推荐:https://blog.csdn.net/column/details/20089.html Gauge是一种轻量级的跨平台测试自动化工具,可以以业务语言编写测试用例. 安装 下 ...

  3. Java学习从入门到精通(1) [转载]

    Java Learning Path (一).工具篇 一. JDK (Java Development Kit) JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envi ...

  4. ios 从url字符串中获取图片名字

    NSString *str = @"http://pic92.nipic.com/file/20160323/22486259_160209631000_2.jpg"; NSLog ...

  5. Ubuntu安装sublime test 3 (Build 3126)

    Ubuntu下 Sublime Text 3 (Build 3143) 存在一些bug........ 满心欢喜地更新后, 又默默换回Build 3126 1. 安装 sudo apt-get upd ...

  6. 怎样新建Quartusproject—FPGA新手教程

    这一章我们来实现第一个FPGAproject-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建project,代码设计,综合实现.管脚约束,下载FPGA程序. 掌握本章内 ...

  7. Hbase和RDBMS(关系数据库管理系统)区别

    hbase是一个基于列模式的映射数据库,键--->数据 的映射,大大简化了传统数据   数据类型:hbase的存储的数据都是字符串,所有的类型都有用户自己处理,他只保存字符串;传统的数据有丰富的 ...

  8. oracle中直方图的使用

    本文从不绑定变量和绑定变量两种情况讨论直方图的作用 一.不绑定变量 SQL> create table test(name varchar2(10));表已创建.SQL> insert i ...

  9. memcached在Java中的应用以及magent的配置-每天进步一点点

    memcached在Java中的应用: http://nhy520.iteye.com/blog/1775893 magent配置memcached分布式集群的应用: http://www.jians ...

  10. /etc/cron.d添加定时任务脚本后不生效

    原因:定时任务脚本中的命令中包含了环境变量,crontab不能读取到环境变量. vim /etc/cron.d/mymon #mymon内容如下: * * * * * root cd $GOPATH/ ...