__init __里面的参数对应了实例初始化输入的参数
__call __把类当成了一个可调用对象(类似于函数),传入的参数也都是与 __ call __相一致的
所有的函数都是可调用对象。
一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。
我们把 Person 类变成一个可调用对象:
class Person(object):
def init(self, name, gender):
self.name = name
self.gender = gender
def __call__(self, friend):
print 'My name is %s...' % self.name
print 'My friend is %s...' % friend
现在可以对 Person 实例直接调用:
p = Person(‘Bob’, ‘male’)
p(‘Tim’)
My name is Bob…
My friend is Tim…
单看 p(‘Tim’) 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。
实例:
完成斐氏数列
class Fib(object):
def init(self):
pass
def call(self,num):
a,b = 0,1;
self.l=[]
for i in range (num):
self.l.append(a)
a,b= b,a+b
return self.l
def str(self):
return str(self.l)
rept=str
f = Fib()
print f(10)
注意还有一个
@property
在类定义的函数前加上@property,使得该函数可直接调用,封装起来
对于@staticmethod
声明了静态方法 f,类可以不用实例化就可以调用该方法 C.f(),当然也可以实例化后调用 C().f()
该方法不强制要求传递参数