将功能组合到方法中

时间:2013-12-13 22:15:02

标签: python

我在Perl / Moose中编写了一些使用方法修饰符(之前/之后/周围)的东西,我想知道将“功能”组合成方法的“Pythonic”方式是什么?

为了扩展,我有一个需要处理的数据结构,数据被“标记”以根据应该如何处理来标记它。我检查这些标签,然后相应地动态构建我的处理器。使用Perl的Moose我可以提取我需要的“特征”,然后运行一个方法来处理数据。我引入的每个“角色”都假设有一个“过程”方法,它只是用after 'process' => sub { }来强制它的功能。这样,如果我有一个新类型的数据来处理我可以简单地添加另一个角色,而不必触及任何其他代码。所有这些都特别避免了任何继承,并且管理起来非常简单。

我想过尝试使用装饰器和/或元类来重新创建Moose的“方法修饰符”,但我想知道Python中的惯用方法是什么......

由于

2 个答案:

答案 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)