如何在不明确接受的情况下进入Python方法

如何在不明确接受的情况下进入Python方法,第1张

如何在不明确接受的情况下进入Python方法

这是一种单行方法修饰器,它似乎无需修改标记为只读的Callable type
*的
任何特殊属性即可完成此工作:

# method decorator -- makes undeclared 'self' argument available to methodinjectself = lambda f: lambda self: eval(f.func_pre, dict(self=self))class TestClass:    def __init__(self, thing):        self.attr = thing    @injectself    def method():        print 'in TestClass::method(): self.attr = %r' % self.attr        return 42test = TestClass("attribute's value")ret = test.method()print 'return value:', ret# output:# in TestClass::method(): self.attr = "attribute's value"# return value: 42

需要注意的是,除非你采取预防措施,以防止它,一个副作用的的

eval()
功能可能是它增加了一些条目-
如在参考
__builtin__
下键模块
__builtins__
-自动将
dict
传递给它。

@kendall:根据您的评论,如何将其与容器类中的方法一起使用(但暂时不考虑其他变量的注入)-以下是您正在做的事情吗?对于我来说,很难理解框架和用户编写的内容之间是如何划分的。对我来说,这听起来像是一个有趣的设计模式。

# method decorator -- makes undeclared 'self' argument available to methodinjectself = lambda f: lambda self: eval(f.func_pre, dict(self=self))class methodclass:    def __call__():        print 'in methodclass::__call__(): self.attr = %r' % self.attr        return 42class TestClass:    def __init__(self, thing):        self.attr = thing    method = injectself(methodclass.__call__)test = TestClass("attribute's value")ret = test.method()print 'return value:', ret# output# in methodclass::__call__(): self.attr = "attribute's value"# return value: 42


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5647410.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存