定义在class中不需要直接调用,python的某些函数或操作符会自动的调用对应的特殊方法.
1、python中 __str__和__repr__
__str__()用于显示给用户,而__repr__()用于显示给开发人员。__str__是可打印的字符输出,内建str()及print语句
1 class Person(object): 2 def __init__(self, name, gender): 3 self.name = name 4 self.gender = gender 5 6 def __str__(self): 7 return '(Person: %s, %s)' % (self.name, self.gender) 8 9 __repr__ = __str__ #直接让repr和str相同 10 11 p=Person('chengjiaxing','femail') 12 print(p) #输出(Person: chengjiaxing, femail) 13
2、python中 __cmp__
为了对对象进行排序,可以使用函数sorted函数,前提是设置了类的__cmp__方法。
1 class Student(object): 2 def __init__(self, name, score): 3 self.name = name 4 self.score = score 5 def __str__(self): 6 return '(%s: %s)' % (self.name, self.score) 7 __repr__ = __str__ 8 9 def __cmp__(self, s): 10 if self.name < s.name: 11 return -1 12 elif self.name > s.name: 13 return 1 14 else: 15 return 0 16 17 >>> L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 77)] 18 >>> print sorted(L) 19 [(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。
1 class Fib(object): 2 def __init__(self,num): 3 a,b,L=0,1,[] 4 for n in range(num): 5 L.append(a) 6 a,b=b,a+b 7 self.numbers=L 8 9 def __str__(self): 10 return str(self.numbers) 11 12 __repr__=__str__ 13 14 def __len__(self): 15 return len(self.numbers) 16 17 18 f=Fib(10) 19 print(f) 20 print(len(f))
4、python中类型转换
1 class Rational(object): 2 def __init__(self, p, q): 3 self.p = p 4 self.q = q 5 6 def __int__(self): 7 return self.p //self.q 8 9 def __float__(self): 10 return float(self.p) /float(self.q) 11 12 13 print(float(Rational(7, 2))) #3.5 14 print(float(Rational(1, 3))) #0.3333333333333333 15 print(int(Rational(7,2))) #3
5、python中运算符重载
1 class Time60(object): 2 def __init__(self,hr,min): 3 self.hr=hr 4 self.min=min 5 6 def __str__(self): 7 return '%d:%d'%(self.hr,self.min) 8 9 def __add__(self,other): #重载 + 操作符 10 if self.min+other.min >60: 11 minute=max(self.min,other.min)-min(self.min,other.min) 12 hr=self.hr+other.hr+1 13 else: 14 hr=self.hr+other.hr 15 minute=self.min+other.min 16 return self.__class__(hr,minute) 17 #Time60(hr,minute) 18 19 20 def __iadd__(self, other): #重载 += 操作符 21 if self.min+other.min >60: 22 self.min=max(self.min,other.min)-min(self.min,other.min) 23 self.hr=self.hr+other.hr+1 24 else: 25 self.hr=self.hr+other.hr 26 self.min=self.min+other.min 27 return self 28 29 __repr__=__str__ 30 31 mon=Time60(6,54) 32 tue=Time60(3,47) 33 print(mon,tue) #6:54 3:47 34 print(mon+tue) #10:7 35 mon+=tue 36 print(mon) #10:7
转载:https://www.cnblogs.com/oucsheep/p/6711461.html