Python: разрешать объекты классов только в определенных цепочечных функциях

#python

Вопрос:

Моя основная настройка заключается в том, что у меня есть класс (я его называю Special ), который должен использоваться только внутри определенных функций другого класса (я его называю AllowsSpecial ). Я понял это следующим образом:

 class AllowsSpecial:
    _special_allowed = False

    def __init__(self):
        AllowsSpecial._special_allowed = True

    def func1(self, *args):
        # ... do something with Special
        AllowsSpecial._special_allowed = False
        return

    def func2(self, *args):
        # ... do something different with Special
        AllowsSpecial._special_allowed = False
        return


class Special:
    def __init__(self):
        if AllowsSpecial._special_allowed is False:
            raise Exception("Special can only be used in functions of AllowsSpecial()")
 

с этим можно сделать что-то вроде

 AllowsSpecial().func1(Special()) 
 

но если я, например, это сделаю:

 sp = Special() 
 

это вызовет исключение. Пока все хорошо…

Теперь я также хотел бы, чтобы функции func1 и func2 возможности были цепными. Это означало бы сначала, что func1 и func2 вернулось self бы, и чем я хотел бы заняться что-то вроде:

 AllowsSpecial().func1(Special()).func2(Special())
 

при текущей настройке это, очевидно, приведет к сбою, поскольку func1 сбрасывает _special_allowed разрешенную переменную на False .

Единственным решением, которое я придумал, было использование вспомогательного класса, подобного этому

 class Also:
    @property
    def also(self):
        return AllowsSpecial()
 

это возвращает новый AllowsSpecial() объект. Тогда вместо того, чтобы вернуться self , func1 и func2 я бы return Also()

чем я, по крайней мере, смог бы это сделать:

 AllowsSpecial().func1(Special()).also.func2(Special())
 

У кого-нибудь есть идея, как я мог бы сделать это без промежуточного Also класса?

Комментарии:

1. Это кажется ужасным шаблоном для использования. Пожалуйста, объясните, какую более глубокую проблему вы надеетесь решить с помощью этого? Что делать, если код имеет AllowsSpecial(); Special() ?

2. @trincot о да, это на самом деле хороший момент 🙂 В общем, проблема в том, что у меня есть класс, который должен использоваться только с набором заданных функций, потому что он использует некоторое глобальное состояние, о котором заботятся эти функции. Но если их использовать снаружи, они испортят это состояние. Таким образом, общая идея заключалась в том, чтобы создавать исключение всякий раз, когда кто-то пытается использовать этот класс не в предопределенных функциях, чтобы предотвратить ошибки …

3. какое-то глобальное государство : плохая идея. Инкапсулируйте свое состояние. Но все это слишком расплывчато. Невозможно ответить без очень конкретного примера использования.