培根熏肉
2016-07-01 17:48
class Fib(object):
def __init__(self,num):
a,b,L=0,1,[]
for i in range(num):
L.append(a)
a,b=b,a+b
self.numbers=L
def __str__(self):
return str(self.numbers)
__repr__=__str__
def __call__(self,numb):
return Fib(numb)
f = Fib()
print f(10)
答案上用call代替了init的位置,不需要初始化了吗?
# -*- coding:utf-8 -*-
# 给你写个例子
class Test(object):
def __init__(self,name):
print("我是构造函数,在实例化的时候会执行","传入的参数是:%s" % (name))
self.name = name
def __str__(self):
return "输出对象,我是重写的__str__方法"
def __call__(self,name):
print("我是__call__方法,将返回一个可调用对象", "传入的参数是:%s" % (name))
print("类中的name是:%s" % (self.name))
test = Test('class')
print(test)
print("------------------")
print(test('def __call__'))执行结果:
我是构造函数,在实例化的时候会执行 传入的参数是:class 输出对象,我是重写的__str__方法 ------------------ 我是__call__方法,将返回一个可调用对象 传入的参数是:def __call__ 类中的name是:class None
如果你细心,你会发现,最后一个self.name打印的结果是None,其实,__call__方法就是重写了“()”运算符,让返回的内容,具有了函数执行的能力,这个和原先的类没有关系。
上面写错了,打印的None,其实是__call__方法没有定义return 语句
其实你这样做,有点多此一举,Fib(10)本来就是实例化一个类的,他执行的是__init__方法,所以,在你的代码里__call__方法根本就没有执行,在print的时候,你又刚好实现了__str__方法,才让print f正确执行。其实__call__方法是这样的意思,如果你想把一个类像函数一样调用,可是实现__call__方法,在你实例化类之后 f = Fib(10),你实例化得到的其实是__call__方法的一个引用,他保存在 f 中,你就可以像__call__方法定义的那样,用f变量去调用__call__方法了。
最后一步有错,如下修改:
f = Fib(10)
print f
python进阶
255495 学习 · 3038 问题