为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

GCT1015 2021-12-21 15:57:18
我是一个新的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')
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

@ - 应用装饰器(语法糖)

. - 属性访问

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 time


def simple_decorator(func):

    def wrapper(*args, **kwargs):

        print('i am simple decorator', func, args, kwargs)

        return func(*args, **kwargs)

    return wrapper


@simple_decorator

def 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_decorator


d_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)


查看完整回答
反对 回复 2021-12-21
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

正如 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 wrapper


predict_all = Predict() 



@predict_all.property("sequences")

def foo():

    pass


foo()


# result -- sequences



希望它有帮助


查看完整回答
反对 回复 2021-12-21
  • 2 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信