将Python方法动态绑定到实例会正确绑定方法名称,但不会绑定方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了将Python方法动态绑定到实例会正确绑定方法名称,但不会绑定方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2395字,纯文字阅读大概需要4分钟。
内容图文
我正在为一组RESTful服务编写客户端.在给定参数的情况下,REST调用的主体具有相同的XML结构.有几十个电话,我不会实现所有这些电话.因此,我希望它们易于指定且易于使用. REST方法按功能分组在单独的模块中,需要共享相同的urllib2开启程序以进行身份??验证和cookie.这是一个如何声明方法的示例:
@rest_method('POST', '/document')
def createDocument(id, title, body):
# possibly some validation on the arguments
pass
所有开发人员都必须关心的是验证. XML(用于POST和PUT)或URL(用于GET和DELETE)以及响应的反序列化的格式在辅助方法中完成.装饰的方法收集在客户端对象中,从中执行和处理它们.例如:
c = RESTClient('http://foo.com', username, password)
c.createDocument(1, 'title', 'body')
代码完成了.唯一的问题是将装饰方法附加到客户端类.尽管可以在客户端实例中看到所有修饰的方法,但它们都共享相同的定义,即最后一个要绑定的定义.这是一个简短的例子,它复制了我所看到的行为:
import types
class C(object): pass
def one(a): return a
def two(a, b): return a+b
def bracketit(t): return '(%s)' % t
c = C()
for m in (one, two):
new_method = lambda self, *args, **kwargs: bracketit(m(*args, **kwargs))
method = types.MethodType(new_method, c, C)
setattr(C, m.__name__, method)
print c.one
print c.two
print c.two(1, 2)
print c.one(1)
当我运行它时,我得到以下输出:
<bound method C.<lambda> of <__main__.C object at 0x1003b0d90>>
<bound method C.<lambda> of <__main__.C object at 0x1003b0d90>>
(3)
Traceback (most recent call last):
File "/tmp/test.py", line 19, in <module>
print c.one(1)
File "/tmp/test.py", line 12, in <lambda>
bracketit(m(*args, **kwargs))
TypeError: two() takes exactly 2 arguments (1 given)
我不确定为什么这两种方法以同样的方式绑定.我无法找到关于instancemethod如何将方法绑定到实例的文档.引擎盖下发生了什么,我将如何修复上面的代码,以便第二个调用打印'(1)’?
解决方法:
lambda正在调用m,将其从本地范围中拉出来.在for循环结束后,m被设置为2.调用c.one或c.two将导致两个被调用.
您可以通过查看回溯的最后一行来判断是否正在调用两个:
TypeError: two() takes exactly 2 arguments (1 given)
A good demonstration of what is going on can be found here.
这应该做你期望的,但有点凌乱:
class C(object): pass
def one(a): return a
def two(a, b): return a+b
def bracketit(t): return '(%s)' % t
c = C()
for m in (one, two):
def build_method(m):
return (lambda self, *args, **kwargs:
bracketit(m(*args, **kwargs)))
method = build_method(m)
setattr(C, m.__name__, method)
print c.one
print c.two
print c.two(1, 2)
print c.one(1)
我还删除了未绑定方法的显式创建,因为它是无关紧要的.
内容总结
以上是互联网集市为您收集整理的将Python方法动态绑定到实例会正确绑定方法名称,但不会绑定方法全部内容,希望文章能够帮你解决将Python方法动态绑定到实例会正确绑定方法名称,但不会绑定方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。