在函数内访问函数(嵌套函数?)

17 投票
5 回答
27686 浏览
提问于 2025-04-16 23:33

我是个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 函数内部的一个局部变量,你无法从外部访问一个函数内部的局部变量。(这其实也没什么意义,因为局部变量只有在函数运行的时候才存在。想想看——从函数外部访问 fibc 变量,这样合理吗?)

撰写回答