ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 使用类装饰器来实现后期初始化

2019-07-23 05:08:37  阅读:216  来源: 互联网

标签:python decorator lazy-initialization


我正在使用一些需要连接到数据库的类.只有在执行实际操作时才需要连接.我想延迟连接阶段,直到确实需要它为止.为此,我想做类似的事情:

class MyClass

    def __init__(self):
        self.conn = None

    def connect(self):
        if self.conn : return
        self.conn = ConnectToDatabase()

    @connect
    def do_something1(self):
        self.conn.do_something1()

    @connect
    def do_something2(self):
        self.conn.do_something2()

但我不知道如何为类定义连接装饰器.

我当然可以这样做:

    def do_something1(self):
        self.connect()
        self.conn.do_something1()

但使用装饰器似乎是一种更易读的解决方案.可能吗?

解决方法:

而不是尝试装饰需要连接的函数,而是使用属性来获取连接本身.

class MyClass(object):

    def __init__(self):
        self._conn = None

    @property
    def conn(self):
        if self._conn is None:
            self._conn = ConnectToDatabase()
        return self._conn

    def do_something1(self):
        self.conn.do_something1()

    def do_something2(self):
        self.conn.do_something2()

至于直装饰的例子,玩F.J的答案:

def prerequisite(prerequisite_function, *pre_args, **pre_kwargs):
    def wrapper(func):
        def wrapped(self, *args, **kwargs):
            prerequisite_function(self, *pre_args, **pre_kwargs)
            return func(self, *args, **kwargs)
        return wrapped
    return wrapper

 class MyClass(object):

     def __init__(self):
         self.conn = None

     def connect(self):
         if self.conn is None:
             self.conn = ConnectToDatabase()

     @prerequisite(connect)
     def do_something(self):
         self.conn.do_something()

您还可以通过创建描述符使先决条件更加健壮,以便它可以正确地运行函数和静态方法以及类和实例方法.

标签:python,decorator,lazy-initialization
来源: https://codeday.me/bug/20190723/1510229.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有