首页 / PYTHON / python:概括委托方法
python:概括委托方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python:概括委托方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2420字,纯文字阅读大概需要4分钟。
内容图文
![python:概括委托方法](/upload/InfoBanner/zyjiaocheng/723/f9b45c95d18a4aca845c290a794ac9f5.jpg)
我有一个这样的类包含一个或多个数字元素.
class Foo:
# ... other methods ...
def _update(self, f):
# ... returns a new Foo() object based on transforming
# one or more data members with a function f()
def __add__(self, k):
return self._update(lambda x: x.__add__(k))
def __radd__(self, k):
return self._update(lambda x: x.__radd__(k))
def __sub__(self, k):
return self._update(lambda x: x.__sub__(k))
def __rsub__(self, k):
return self._update(lambda x: x.__rsub__(k))
def __mul__(self, k):
return self._update(lambda x: x.__mul__(k))
def __rmul__(self, k):
return self._update(lambda x: x.__rmul__(k))
def __div__(self, k):
return self._update(lambda x: x.__div__(k))
def __rdiv__(self, k):
return self._update(lambda x: x.__rdiv__(k))
# I want to add other numeric methods also
是否有任何方法可以为所有numeric methods推广这一点,而不必为每一个都做到这一点?
我只想委托数值方法列表中的任何方法.
解决方法:
您希望在此使用operator module以及二进制数字运算符名称的(简短)列表,而不使用下划线来表示紧凑性:
import operator
numeric_ops = 'add div floordiv mod mul pow sub truediv'.split()
def delegated_arithmetic(handler):
def add_op_method(op, cls):
op_func = getattr(operator, op)
def delegated_op(self, k):
getattr(self, handler)(lambda x: op_func(x, k))
setattr(cls, '__{}__'.format(op), delegated_op)
def add_reflected_op_method(op, cls):
? ? op_func = getattr(operator, op)
? ? ? ? def delegated_op(self, k):
? ? ? ? ? ? getattr(self, handler)(lambda x: op_func(k, x))
? ? ? ? setattr(cls, '__r{}__'.format(op), delegated_op)
def decorator(cls):
for op in numeric_ops:
add_op_method(op, cls)
add_reflected_op_method(op, cls) # reverted operation
add_op_method('i' + op, cls) # in-place operation
return cls
return decorator
现在只需装饰你的班级:
@delegated_arithmetic('_update')
class Foo:
# ... other methods ...
def _update(self, f):
# ... returns a new Foo() object based on transforming
# one or more data members with a function f()
装饰器使用您想要委派调用的名称来使其更通用.
演示:
>>> @delegated_arithmetic('_update')
... class Foo(object):
... def _update(self, f):
... print 'Update called with {}'.format(f)
... print f(10)
...
>>> foo = Foo()
>>> foo + 10
Update called with <function <lambda> at 0x107086410>
20
>>> foo - 10
Update called with <function <lambda> at 0x107086410>
0
>>> 10 + foo
Update called with <function <lambda> at 0x107086410>
20
>>> 10 - foo
Update called with <function <lambda> at 0x107086410>
0
内容总结
以上是互联网集市为您收集整理的python:概括委托方法全部内容,希望文章能够帮你解决python:概括委托方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。