这是 python 装饰器还是 python 属性?

我是一个新的python程序员,在阅读以下代码时,我不明白代码的意思:@predict_all.property('sequences'). 我发现python装饰器几乎就像@decortor风格一样。所以我很困惑这个代码@predict_all.property('sequences')时,有是一个点.以下的@predict_all。这是一个python装饰器还是一个python属性?


@recurrent(states=['states', 'cells'], outputs=['destination', 'states', 'cells'])

    def predict_all(self, **kwargs):

        pre_emb = tuple(self.pre_context_embedder.apply(**kwargs))


        itr_in = tensor.concatenate(pre_emb + self.rec_input(**kwargs), axis=1)

        itr = self.input_to_rec.apply(itr_in)

        itr = itr.repeat(4, axis=1)

        (next_states, next_cells) = self.rec.apply(itr, kwargs['states'], kwargs['cells'], mask=kwargs['latitude_mask'], iterate=False)


        post_emb = tuple(self.post_context_embedder.apply(**kwargs))

        rto = self.rec_to_output.apply(tensor.concatenate(post_emb + (next_states,), axis=1))


        rto = self.process_rto(rto)

        return (rto, next_states, next_cells)


    @predict_all.property('sequences')

    def predict_all_sequences(self):

        return self.sequences

补充资料:


问题的根源,我为什么要问这个问题?


当我了解装饰器时,我发现大多数教程都显示装饰器很简单,就像这种风格:@timer,也就是@加上一个功能名称。并且属性是这样的样式:@property,即@property在方法之前添加。所以当我阅读上面的代码时,我很困惑这段代码@predict_all.property('sequences')是什么意思,我以前没有见过这种形式的代码。所以我很困惑,这段代码代表的是python装饰器还是python属性?我用谷歌搜索并没有找到关于这种风格的东西,那就是@plus .。所以我把这个问题贴在 Stack Overflow 上,希望得到有用的答案或评论。


我学到的python装饰器的示例代码如下:


def timer(func): 

    def deco(*args, **kwargs):  

        start_time = time.time()

        func(*args, **kwargs)   

        stop_time = time.time()

        print("the func run time  is %s" %(stop_time-start_time))

    return deco  

@timer 

def test1():

    time.sleep(1)

    print('in the test1')


GCT1015
浏览 168回答 2
2回答

蛊毒传说

@ - 应用装饰器(语法糖). - 属性访问decorator 是可调用的东西,它返回可调用的东西propertiy 是一种特定的装饰器,它是一个返回对象(描述符对象)的类(描述符),在 Python 中属性和描述符用于属性访问控制。现在让我们继续这个问题。Is @predict_all.property('sequences') is a python decorator or a python property? 是装修工。这不是财产。 predict_all返回Application类的对象(https://github.com/mila-iqia/blocks/blob/master/blocks/bricks/base.py#L68)。Application类具有命名方法property,它是一个常规装饰器,用于按指定名称获取类属性。您还可以考虑以下使用装饰器的示例(在线试用https://py3.codeskulptor.org/#user303_jaUkAvGSwi_4.py)import timedef simple_decorator(func):    def wrapper(*args, **kwargs):        print('i am simple decorator', func, args, kwargs)        return func(*args, **kwargs)    return wrapper@simple_decoratordef func_1(*args, **kwargs):    print('i am func_1')class DecoratorManager:    def __init__(self):        self.log = list()    def not_that_simple_decorator(self, key):        self.log.append((time.time(), key))        def simple_decorator(func):            def wrapper(*args, **kwargs):                print('i am simple decorator', func, args, kwargs)                return func(*args, **kwargs)            return wrapper        return simple_decoratord_m = DecoratorManager()@d_m.not_that_simple_decorator(key='pretty_key')def func_2(*args, **kwargs):    print('i am func_2')def func_3(*args, **kwargs):    print('i am func_3')func_3 = d_m.not_that_simple_decorator(key='pretty_key')(func_3)func_1(1, a=10)func_2(2, b=20)func_3(3, c=30)print('decorator_manager_log:', d_m.log)

杨__羊羊

正如 Charles Duffy 所说, predict_all.property可以是一个函数,它返回一个充当装饰器的函数。您可以通过下面的演示进一步了解..class Predict(object):    def property(self, condition):        def wrapper(fn):            def inner(*args, **kw):                if condition == 'sequences':                    print("sequences")                else:                    print("else")                return fn(*args, **kw)            return inner        return wrapperpredict_all = Predict() @predict_all.property("sequences")def foo():    passfoo()# result -- sequences希望它有帮助
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python