python - 我应该装饰一个函数吗?

标签 python

试图确定我是否应该尝试使用装饰器或其他一些 Pythonic 方式来减少我的许多函数正在执行的代码。我希望这些函数能够在每个函数的开头调用另一个函数,或者以某种方式“装饰”每个函数的开头。我以前从未使用过装饰器,并且正在努力以 pythonic 方式实现这个装饰想法,以减少每个函数的通用共享代码集。

我有许多函数将在函数开始时执行相同的一组步骤。然而,公共(public)代码存在一些结构问题,这使得这个“装饰器”的想法变得困难:

  • 这些函数都在父类的子类中。

  • 函数之间的常用命令引用变量名 特定于函数(但函数的子集 姓名)。

  • 常用命令需要返回给调用者,不执行任何 如果满足特定条件,则更多子函数。 (示例代码中的“if jobj :” block )

对于变量/属性示例,子函数 get_nas_server(self) 将利用通用代码集中的“nas_server”变量变体。从函数名称中减去 get_ 可以揭示要在通用代码集中使用的变量名称的基数。来自“get_nas_server”函数名称的示例变量名称和对象属性:

NAS_服务器
nas_server.json
self.nas_server(属性)

这是其中一个函数的通用代码:

        ####################################################################
        def get_nas_server(self):
        ####################################################################
            """\nGets COMMAND nas_server and places data into self.nas_server"""

           try:
               self.nas_server
               return self.nas_server
           except AttributeError:
               pass
           self.get_file_cmd('nas_server')
           jobj = self.fresh_json('nas_server.json')
           if jobj :
               self.nas_server = jobj
               return self.nas_server
           self.get_file_cmd('get_nas_server')

函数中上面代码下面的所有内容都是特定于函数目的的,不适合在这里讨论。基本上,我试图让上面的所有代码都可以在我的函数中重用,但代码必须根据函数名称更改变量和属性。

感谢阅读到这里,感谢所有帮助。

最佳答案

似乎您可以在父类中将其定义为辅助方法:

class Parent(object):
    def _get_something(name):
        try:
            return getattr(self, name)
        except AttributeError:
            pass
       self.get_file_cmd(name)
       jobj = self.fresh_json(name+'.json')
       if jobj :
           setattr(self, name, jobj)
           return jobj
       self.get_file_cmd('get_'+name)

如该片段所示,您可以使用 getattr() , setattr()hasattr()按名称引用对象属性的函数。

关于python - 我应该装饰一个函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32038947/

相关文章:

python - 更改 Python 交互提示 ">>>"

python - 如何加载和重新训练 tflean 模型

python - 简化/优化 for 循环链

python - PyCharm/ python 。代码不运行。立即收到 "Getting Process finished with exit code 0"

python - Pandas df.str.split() 仅在第一个元素上

python - 为什么 cx_oracle execute() 现在不喜欢我的字符串?

python - 在 Python 中删除旧目录

Python 正则表达式 - (\w+) 与复杂表达式一起使用时会产生不同的输出

python - 如何指定一个属性必须是一个(比方说)整数列表,而不仅仅是一个列表?

python - 在进程之间共享列表的正确方法?