首页 > 解决方案 > 如何从受 __init__ 参数限制的对象实例中删除方法?

问题描述

我想编写一个类,在访问特定方法的情况下删除访问或抛出错误,并且此行为应受类实例化时设置的变量的限制。

所以在代码中我想要这样的东西:

class NewClass:

    def __init__(self, has_non_available_method):
        self.has_non_available_method = has_non_available_method

    def some_method(self):
        if self.has_non_available_method:
            raise SomeError()

这很好,但是,如果我想要几个这样的方法,那么我必须将这两行复制粘贴到每个方法中。哪个“看起来不是很复杂”,我想知道是否存在“更好”/ DRY 方法。

我考虑过使用装饰器,但装饰器在类执行时执行,因此它们似乎不适合此任务,因为has_non_available_method此时不会设置属性(在此示例中)。

标签: pythonoop

解决方案


一个装饰器是完美的。

def checkavail(func):
    def wrapper(self, *args, **kwargs):
        if self.has_non_available_method:
            raise SomeError()
        func(self, *args, **kwargs)
    return wrapper

class NewClass:

    def __init__(self, has_non_available_method):
        self.has_non_available_method = has_non_available_method

    @checkavail
    def some_method(self):
        # do stuff

推荐阅读