- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在脚本中编写一些数据库操作函数,并决定使用函数装饰器来处理数据库连接样板。
下面显示了一个简化的示例。
import random
class funcdec(object):
def __init__(self,func):
self.state = random.random()
self.func = func
def __call__(self,*args,**kwargs):
return self.func(self.state,*args,**kwargs)
@funcdec
def function1(state,arg1,**kwargs):
print(state)
@funcdec
def function2(state,arg2,**kwargs):
print(state)
function1(10)
function2(20)
这意味着我可以减少样板文件的数量,但每个函数都有不同的状态对象。所以如果我运行它,我会得到类似的东西:
python decf.py
0.0513280070328
0.372581711374
我想实现一种让所有装饰函数共享此状态的方法,我想到了这个。
import random
class globaldec(object):
def __init__(self,func):
self.state = random.random()
def __call__(self,func,*args,**kwargs):
def wrapped(*args,**kawrgs):
return func(self.state,*args,**kwargs)
return wrapped
@globaldec
class funcdec(object):
pass
@funcdec
def function1(state,arg1,**kwargs):
print(state)
@funcdec
def function2(state,arg2,**kwargs):
print(state)
function1(10)
function2(20)
现在,当我运行它时,每个应用程序只创建一次状态对象,并且所有修饰函数的状态都相同,例如:
python decg.py
0.489779827086
0.489779827086
直觉上这对我来说很有意义,因为 globaldec
只为函数装饰器的所有实例初始化一次。
但是,我对这里到底发生了什么有点不太清楚,事实上 funcdec
对象似乎不再被初始化或调用。
最佳答案
您已经创建了一个装饰器工厂;生成装饰器的可调用对象。在这种情况下,您忽略 globaldec.__init__()
的func
参数(原始funcdec
类对象)当使用 globaldec
类作为装饰器时。您将其替换为 globaldec
类的实例,然后将其用作 function1
和 function2
的真正装饰器。
那是因为装饰器只是语法糖;应用于 class funcdec:
行的 @globaldec
装饰器可以这样表示:
class funcdec(object):
pass
funcdec = globaldec(funcdec)
因此 funcdec
类被替换为 globaldec
的实例。
我不使用类,而是使用函数; func
和 state
等状态成为闭包。
你原来的装饰器可以这样写:
import random
def funcdec(func):
state = random.random()
def wrapper(*args, **kwargs):
return func(state, *args, **kwargs)
return wrapper
因此,当 Python 将其用作装饰器时,funcdec()
返回 wrapper
函数,替换原来的 function1
或 function2
函数被该函数对象替换。调用 wrapper()
然后通过 func
闭包调用原始函数对象。
globaldec
版本只是增加了一层;外部函数生成装饰器,将闭包移出一步:
import random
def globaldec():
state = random.random()
def funcdec(func):
def wrapper(*args, **kwargs):
return func(state, *args, **kwargs)
return wrapper
return funcdec
只需创建一次装饰器:
funcdec = globaldec()
@funcdec
def function1(state,arg1,**kwargs):
print(state)
@funcdec
def function2(state,arg2,**kwargs):
print(state)
另一种模式是将状态存储为全局状态(您可以直接在装饰器函数上这样做:
import random
def funcdec(func):
if not hasattr(funcdec, 'state'):
# an attribute on a global function is also 'global':
funcdec.state = random.random()
def wrapper(*args, **kwargs):
return func(funcdec.state, *args, **kwargs)
return wrapper
现在您不再需要生成专用的装饰器对象,wrapper
现在引用 funcdec.state
作为共享值。
关于Python "Multi-Level Decorator"- 这是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33329652/
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 2 年前。 Improve this ques
运行 jscodeshift -t ./react-codemod/transforms/React-PropTypes-to-prop-types.js ./src 时出现以下错误 Transfor
尝试将带有 vuex-module-decorators 的存储模块加载到初始化程序中时出现此错误: vuex.esm.js?2f62:261 Uncaught TypeError: Cannot r
我在 JBoss AS 7.1.0.Final 上运行的 ear 应用程序由两个 jar 组成: lib/one.jar lib/two.jar 两个 jar 都是 CDI bean 文件。 two.
我想使用两种类型的装饰器: 一) @new def foo(): print("foo") b) @new(arg1, arg2, arg3, ...) def bar(): prin
所以我在这里试图实现的是,我不希望任何超链接带有下划线,同时我希望某些元素被删除。 他们两个单独工作都很好,但我不能同时工作。 代码: a:link { text-decoration:
Env: Wildfly 9.0.1 Weld 2.2.14 我目前正在研究在合理的情况下在我们的遗留代码库中使用 CDI @Decorator 的可能性。 查看规范和 java ee 7
在 JavaScript 函数中,接收函数、修改行为并返回该函数的似乎是装饰器。例如,这将是一个装饰器函数: function doubleDec (func){ return functio
我正在升级到 Babel 7,虽然应用程序正在加载,但我的测试出现了问题。他们以前很好。我从涉及装饰组件的每个测试中都收到此错误。 FAIL src/app/components/pages/Ho
在运行 pip install InstagramAPI 时,我有 2 个错误,我还没有设法修复。 我遇到的第一个错误是 "networkx 2.1 has requirement decorator
我试图做一个装饰器来包装协程或函数。 我尝试的第一件事是在包装器中编写一个简单的重复代码: def duration(func): @functools.wraps(func) def
我有一个非常简单的函数,定义为 def test(x): return x 我想用装饰器包装它,它返回一个需要另一个 kwargs 参数的函数。 @simple_dec def test(x):
我想将我正在使用的 API 分为两个部分:“基本”和“轻松”。这个想法是,'cushy' 部分中的所有方法调用都可以用 'bare-bones' 部分中的方法来表示,也就是说,它们将只作为快速和肮脏的
为什么这不会从 this page 上的 facebook 和刺客行业链接中删除下划线| . .module_wpproad { text-decoration:none; border:none;
为什么这不会从 this page 上的 facebook 和刺客行业链接中删除下划线| . .module_wpproad { text-decoration:none; border:none;
注意:我问的不是常见的 python 装饰器,而是装饰器设计模式。 我想写一个装饰器来修改具体组件调用的函数,下面的代码示例说明了我的问题: In [2]: class Animal: ...:
我有一个类主要提供用于连接存储在字典中的数据的属性。每个属性(通常)负责字典中的一个键,但字典中可能还有其他键,这些键不受属性管理。 编辑 3:澄清一下,因为评论中有些困惑: I have an ar
我在 Django View 上有这个错误: TypeError at /web/host/1/ decorator() got an unexpected keyword argument 'hos
出于调试目的,我想打印出与在 python 方法中执行的每一行有关的内容。 例如,如果行中有一些赋值,我想打印为该变量赋值的值,如果有函数调用,我想打印出函数返回的值,等等。 因此,例如,如果我要使用
装饰模式是一种经典的类功能扩展模式,其精髓在装饰类使用继承加聚合的方式获得接口和要实现对象,然后通过自己实现扩展接口 作用 装饰模式通过装饰类动态地将责任附加到对象上,若要扩展功能,无需通过继承增
我是一名优秀的程序员,十分优秀!