Можно ли написать декоратор, который действует на метод класса и использует атрибуты класса? Например, я хотел бы добавить декоратор к функциям, которые будут возвращать ошибку, если один из атрибутов класса (который устанавливается, когда пользователь вызывает функцию), имеет значение False.
Например, моя попытка (неудачная) код, поскольку is_active не может получить доступ к методам MyClass):
def is_active(active):
if active == False:
raise Exception("ERROR: Class is inactive")
class MyClass():
def __init__(self, active):
self.active = active
@is_active
def foo(self, variable):
print("foo")
return variable
@is_active
def bar(self, variable):
print("bar")
return variable
, где ожидаемое поведение:
cls = MyClass(active=True)
cls.foo(42)
---> function prints "foo" and returns 42
cls = MyClass(active=False)
cls.foo(42)
---> function raises an exception as the active flag is False
Вышеприведенный пример является фиктивным, а фактический вариант использования более сложным, но, надеюсь, это показывает проблему, с которой я сталкиваюсь.
Если вышеупомянутое возможно, мой дополнительный вопрос: возможно ли "скрыть" / удалить методы из экземпляра класса, основанного на этом флаге. Например, если пользователь создает экземпляр класса с помощью active=False
, то когда он использует i Python и нажимает <tab>
, он может видеть только те методы, которые разрешено использовать?
Спасибо вы.