写保护类范围

时间:2019-02-04 10:01:38

标签: python python-3.x

背景

我有一个任务执行程序框架,允许人们编写这样的代码。

class HandleJob(Job):

  @Step()
  def do_work(self, work_order):
    pass

  @Step()
  def continue_with_doing_work(self, work_order):
    pass

框架按定义的顺序调用步骤并传递工作顺序。重要的是要知道,Step的不同实例可以调用不同的HandleJob,或者在脚本的不同执行期间也可以调用不同的self。这意味着开发人员不能在一个Step中向Step写东西,并期望它在另一个self中可用。

有一个专用的位置来存储以后需要的数据,并且文档对此很清楚。但是,我仍然希望能够强制执行“早期失败”。

问题(TLDR)

有什么方法可以锁定范围,以防止开发人员在运行时将变量写入self

进一步使事情复杂化。他们应该能够在构造函数中写入WeScan

1 个答案:

答案 0 :(得分:1)

我找到了解决方法(Overriding __setattr__ at runtime)。

class Job:

    _scope_locked = False

    def __init__(self, work_order_id, strict=True):
        if strict:
            self._scope_locked = True

    def __setattr__(self, attr, value):
        if self._scope_locked:
            raise Exception("'self' locked")
        else:
            super(Job, self).__setattr__(attr, value)

此解决方案的唯一问题是,super必须在子类构造函数中最后调用。哦,很好。