形如__xxx__的函数是类的特殊方法。
常需要修改的特殊方法有下面这些:
__str__()
print语句输出的结果。
__repr__()
命令行直接输入类名的输出结果。
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__
p = Person('Bob', 'male')
print p
>>> p
输出:
(Person: Bob, male)
(Person: Bob, male)
__cmp__()
类的比较规则。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def __cmp__(self, s):
if self.score < s.score :
return -1
elif self.score > s.score :
return 1
else:
return 0
__len__()
类似list的类返回的元素数量。
class Students(object):
def __init__(self, *args):
self.names = args
def __len__(self):
return len(self.names)
ss = Students('Bob', 'Alice', 'Tim')
print len(ss)
输出:3
数学运算符
__add__()、__sub__()、__mul__()、__div__()
有理数的加减乘除:
def gcs(a,b,c=1):
if 0==a%2 and 0==b%2:
return gcs(a/2,b/2,c*2);
s = abs(a-b)
m = min(a,b)
if s == m:
return m*c
return gcs(s,m,c)
class Rational(object):
def __init__(self, p, q):
self.p = p
self.q = q
def __add__(self, r):
return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
def __sub__(self, r):
return Rational(self.p * r.q - self.q * r.p, self.q * r.q)
def __mul__(self, r):
return Rational(self.p * r.p, self.q * r.q)
def __div__(self, r):
return Rational(self.p * r.q , self.q * r.p)
类型转换
__int__()、__float__()等
把有理数转换为整数和浮点数:
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 self.p*1.0/self.q
@property装饰器与@score.setter装饰器
一起使用,用于把getter和setter方法变成属性。
class Student(object):
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
s = Student()
s.score = 60 # OK,实际转化为s.set_score(60)
s.score # OK,实际转化为s.get_score()
s.score = 9999
输出:
60
Traceback (most recent call last):
...
ValueError: score must between 0 ~ 100!
__slots__()
指定一个类允许的属性列表。
class Person(object):
__slots__ = ('name', 'gender')
__call__()
把一个类变成一个可调用的对象。
class ImFunc(object):
def __call__(self,words):
print 'i say %s' % words
imfunc = ImFunc()
imfunc('what the func?') #把类当函数使用