#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. какое-то глобальное государство : плохая идея. Инкапсулируйте свое состояние. Но все это слишком расплывчато. Невозможно ответить без очень конкретного примера использования.