☆定制类
特殊方法:
也叫魔术方法
问:Python如何把任意变量变成str?
答:任何数据类型的实例都有一个特殊方法
__str__()
相当于Java的toString()
方法
print lst
#其实,就是
print lst.__str__()
还有那些呢:
用于
__str__()
用于len
的__len__()
用于cmp
的__cmp__()
特点:
特殊方法定义在class中,不需要直接调用
Python的某些函数会自动调用对应的特殊方法
为了正确实现特殊方法<相当于Java的方法重写>,有关联方法的都要实现。
__str__
和__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
==>(Person : Bob, male)
p
==><main.Person object at 0x10c9f57810)
#@注释一
__str__ 用于print p
__repr__ 直接p
__cmp__
: 碧螺春
__len__
:
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)
Python中的数学运算:
Python提供的基本数据类型 int, float可以做整数和浮点数的四则运算,以及乘方等运算。
但是,四则运算不局限于 int 和 float, 还可以是有理数、矩阵等
#用Rational类表示有理数
class Rational(object):
def __init__(self, p, q):
self.p = p
self.q = q
#加法
def __add__(self, r):
return Ration(self.p*r.q + self.q*r.p, self.q*r.q)
def __str__(self):
return '%s / %s' % (self.p, self.q)
#再在此添减法`__sub__`,乘法`__mul__`,除法`__div__`
#注意 最大公约数 gcd ——辗转相除
r1 = Rational(1, 3)
r2 = Rational(1, 2)
print r1 + r2
==> 5/6
Python类型转换:
python中Rational类实现了有理数运算,但是如果要把结构转换为 int 或 float ,怎办。
把 Rational转换为int , 应该使用
r = Rational(12, 5)
n = int(r)
要让int 函数正常工作,只需要实现特殊方法 __init__()
class Rational(object):
def __init__(self, p, q):
self.p = p
self.q = q
def __int__(self):
return self.p // self.q
print int(Rational(7, 2))
同理,需要让float
函数正常工作,只需要实现特殊方法__float__()
@property
__slots__
由于Python是动态语言,任何实例在运行期间都可以动态地添加属性。
如果要限制添加的属性,例如,Student类只允许添加name
, gender
和score
可以利用 __slots__
来实现
class Student(object):
__slots__('name', 'gender', 'school')
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
self.score = score
s = Student('Bob', 'male', 59)
s.age = 19
==>
AttributeError
__call__
__slots__
的目的是限制当前类所拥有的属性,如果不需要动态添加属性
使用__slots__
还能节省内存
Python中函数是对象,所有函数都是可调用对象
一个类实例也可以变成一个可调用对象,只需要实现__call__
方法,即可