У меня есть класс, который по существу функционирует как пример ниже. Конструктор принимает два аргумента, которые по умолчанию равны None
, если значение не указано. Цель этого класса заключается в том, чтобы при заданном значении foo
пользователь мог вызвать функцию calculateBar()
для вычисления значения bar
. И наоборот, пользователь должен иметь возможность предоставить значение для bar
, а затем вызвать функцию calculateFoo()
, чтобы вычислить значение для foo
. Примечательно, что эти функции, по сути, являются обратными друг другу.
class ExampleClass:
def __init__(self, foo=None, bar=None):
self.foo = foo
self.bar = bar
# Essentially an XNOR. Raises an exception if:
# 1. Both foo and bar are 'None' (no value given for either)
# 2. Neither foo, nor bar are 'None' (value given for both)
if bool(foo == None) == bool(bar == None):
raise ValueError("Please give a value for Foo or Bar (but not both)")
def calculateFoo(self):
return self.bar / 2.0
def calculateBar(self):
return self.foo * 2.0
Проблема, с которой я столкнулся, заключается в том, что я хочу ограничить класс только тем, чтобы пользователь мог указать значение для foo
ИЛИ значение для bar
, но не оба, т. Е. Ровно один из них должен содержать значение, а другой должен быть None
. Мой текущий метод заключается в том, чтобы просто вызвать исключение в случае, когда либо foo=None and bar=None
, либо foo!=None and bar!=None
. Это, однако, кажется неэффективным решением. Есть ли лучший способ ограничить пользователя вводом только одного из двух аргументов, но при этом разрешить правильное использование функций calculateFoo()
и calculateBar()
? Есть ли лучший способ организовать класс, чтобы позволить то, что мне нужно?