Python3添加了一個__prepare__
,以便您可以用類別聲明替換用於收集項目的字典類型(請參閱here。)使用__prepare__
我可以設置類以允許多重定義相同的成員函數。關閉範圍內的捕獲函數
class MultiType(type):
@classmethod
def __prepare__(metacls, name, bases, **kwds):
return collections.defaultdict(list)
class Foo(metaclass=MultiType):
def bar(self, x):
return x - 1
def bar(self, x):
return x
在模塊級,我可以使用裝飾玩一些花招:
def capture(f):
module = importlib.import_module(f.__module__)
if not hasattr(module, 'my_cache'):
setattr(module, 'my_cache', [])
module.my_cache.append(f)
@functools.wraps(f)
def _wrapper(*args, **kwargs):
return (func(*args, **kwargs) for func in module.my_cache)
return _wrapper
@capture
def foo(x):
return x - 1
@capture
def foo(x):
return 42
但是,如果我這樣做一個閉包內,我可能會添加一些東西作用域在模塊級即應不是。
def foo(x):
@some_awesome_deco
def bar(y):
return y
@some_awesome_deco
def bar(y):
return 24
return bar(x+1)
有沒有一種方法來識別和捕獲閉包的範圍內聲明的,這樣我可以比在模塊範圍內聲明的函數不同的方式處理這些功能,而無需引用關閉切換功能(即@some_awesome_deco(foo)
?)
這會發生在導入時或始終在運行時?我沒有使用'sys._getframe'函數。 – wheaties
@wheaties:在嵌套的作用域中,總是在運行時執行該函數。全局範圍僅在導入時執行。 –
@wheaties:裝飾器只是裝飾裝飾對象時執行的函數。 –