Python noob在这里.如何掌握'fib'功能中的'内部'功能?
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()
Run Code Online (Sandbox Code Playgroud)
cdh*_*wie 14
你不能,除非以某种方式fib返回inner. inner本质上是一个局部变量fib,你不能从它的外部访问函数的本地变量.(这甚至不会是有意义的,因为该功能正在运行时,除了不存在当地人想想看-会是有意义的访问fib的c?从功能以外的变量)
请勿使用以下物品.
[...]
>>> 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!
Run Code Online (Sandbox Code Playgroud)
你可以简单地看它,它不是真正的Python告诉,并为此事它是不是真的叫"内部"功能本身,它只是创造一个像它一个新的功能.我也没有打扰设置全局'正确',因为这首先是一件可怕的事情.
[我应该提到的是,上面的要点是要注意,你不能从外部访问内部的想法并不严格,尽管这几乎不是一个好主意.例外情况包括口译员级别的代码检查等.]
不洁净!不洁净!
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
Run Code Online (Sandbox Code Playgroud)
此代码段将允许您使用内部.
下面似乎实现了你想要的
from types import CodeType, FunctionType
def find_nested_func(parent, child_name):
""" Return the function named <child_name> that is defined inside
a <parent> function
Returns None if nonexistent
"""
consts = parent.func_code.co_consts
for item in consts:
if isinstance(item, CodeType) and item.co_name==child_name:
return FunctionType(item, globals())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14965 次 |
| 最近记录: |