python用特殊方法定制类(不全)

定义在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

原文地址:https://www.cnblogs.com/xiongxueqi/p/8583317.html