在函数内访问函数(嵌套函数?)
我是个Python新手。
我该如何在'fib'函数里面获取到'inner'这个函数呢?
from time import sleep
class Fibonacci(object):
def __init__(self, a, b, limit=50):
self.a = a
self.b = b
self.limit = limit
def fib(self):
while self.a < self.limit:
c = self.a + self.b
sleep(1)
print self.a,
self.b = self.a
self.a = c
def inner(self):
print 'Damn it! Just print already!'
j = Fibonacci(0,1,2)
j.fib()
## This doesn't work. Gives an "AttibuteError: 'function' object has no attribute 'inner'"
j.fib.inner()
5 个回答
6
from time import sleep
class Fibonacci(object):
def __init__(self, a, b, limit=50):
self.a = a
self.b = b
self.limit = limit
def fib(self):
while self.a < self.limit:
c = self.a + self.b
sleep(1)
print self.a,
self.b = self.a
self.a = c
def inner(self):
print 'Damn it! Just print already!'
Fibonacci.fib.inner = inner
fib.inner = None
这段代码可以让你使用内嵌功能。
11
不要使用以下内容。
[...]
>>> j = Fibonacci(0,1,2)
>>> j.fib()
0 1 1
>>> # dark magic begins!
>>> import new
>>> new.function(j.fib.im_func.func_code.co_consts[2],{})(None)
Damn it! Just print already!
光看这个代码就知道它根本不是Python,而且它其实并没有真正调用“内部”函数,而只是创建了一个类似的新的函数。我也懒得把全局变量设置得“正确”,因为这样做本身就是个糟糕的主意。
[我得提一下,上面的内容是想说明,外部无法访问内部的这个说法并不完全正确,虽然通常这样做并不是个好主意。例外情况包括解释器级别的代码检查等等。]
不干净!不干净!
20
你不能这样做,除非 fib
以某种方式返回 inner
。其实 inner
就是 fib
函数内部的一个局部变量,你无法从外部访问一个函数内部的局部变量。(这其实也没什么意义,因为局部变量只有在函数运行的时候才存在。想想看——从函数外部访问 fib
的 c
变量,这样合理吗?)