我在Perl / Moose中编写了一些使用方法修饰符(之前/之后/周围)的东西,我想知道将“功能”组合成方法的“Pythonic”方式是什么?
为了扩展,我有一个需要处理的数据结构,数据被“标记”以根据应该如何处理来标记它。我检查这些标签,然后相应地动态构建我的处理器。使用Perl的Moose我可以提取我需要的“特征”,然后运行一个方法来处理数据。我引入的每个“角色”都假设有一个“过程”方法,它只是用after 'process' => sub { }
来强制它的功能。这样,如果我有一个新类型的数据来处理我可以简单地添加另一个角色,而不必触及任何其他代码。所有这些都特别避免了任何继承,并且管理起来非常简单。
我想过尝试使用装饰器和/或元类来重新创建Moose的“方法修饰符”,但我想知道Python中的惯用方法是什么......
由于
答案 0 :(得分:1)
我几乎不知道任何Perl,但是通过查看MethodModifier docs中的第一个示例,我觉得Python中的context managers最像是Moose的方法修饰符:
class MyContextManager(object):
def __init__(self, data):
self.data = data
def __call__(self):
print 'foo'
def __enter__(self):
print "entering... (data=%s)" % self.data
# this will be bound to the name after the 'as' clause
return self
def __exit__(self, exc_type, exc_value, traceback):
print "exiting... (data=%s)" % self.data
with MyContextManager('bar') as manager:
print "before"
manager()
print "after"
输出:
entering... (data=bar)
before
foo
after
exiting... (data=bar)
不幸的是,上下文管理器的文档有点分散:
答案 1 :(得分:0)
只是为了扩展@LukasGraf,动态地回答上下文...(在Python 3中)
from contextlib import ExitStack
class Manager1():
def __init__(self, data):
self.data = data
def __enter__(self):
print("entering 1... (data=%s)" % self.data)
return self
def __exit__(self, exc_type, exc_value, traceback):
print("exiting 1... (data=%s)" % self.data)
class Manager2():
def __init__(self, data):
self.data = data
def __enter__(self):
print("entering 2... (data=%s)" % self.data)
return self
def __exit__(self, exc_type, exc_value, traceback):
print("exiting 2... (data=%s)" % self.data
contexts = [Manager2('test'), Manager1('test')]
with ExitStack() as stack:
[ stack.enter_context(context) for context in contexts ]
print('here')
...生成
entering 2... (data=test)
entering 1... (data=test)
here
exiting 1... (data=test)
exiting 2... (data=test)