我只需要使用operatorDict一次来确定我正在为该类使用哪个操作。在self._f中存储正确运算符的最pythonic方法是什么?
class m:
def __init__(self,n,operator,digit1,digit2):
self._operatorDict = {'+':add, '-':sub, 'x':mul, '/':truediv}
self._f = self._operatorDict[operator]
self._score = 0
self._range = n
self._aMin, self._aMax = getMaxMinDigits(digit1)
self._bMin, self._bMax = getMaxMinDigits(digit2)
答案 0 :(得分:2)
这很大程度上取决于您想要暴露多少operatorDict。在这种情况下,我可能会推荐两件事之一。
class m:
_operatorDict = {'+':add, '-':sub, 'x':mul, '/':truediv}
def __init__(self,n,operator,digit1,digit2):
self._f = self._operatorDict[operator]
self._score = 0
self._range = n
self._aMin, self._aMax = getMaxMinDigits(digit1)
self._bMin, self._bMax = getMaxMinDigits(digit2)
由于_operatorDict
不会在类中变异,因此似乎没有必要将它作为实例属性。但是,它在某种意义上仍属于该类。此方法还允许您根据需要更改operatorDict
(例如,在子类中)。
_operatorDict = {'+':add, '-':sub, 'x':mul, '/':truediv}
class m:
def __init__(self,n,operator,digit1,digit2):
self._f = _operatorDict[operator]
self._score = 0
self._range = n
self._aMin, self._aMax = getMaxMinDigits(digit1)
self._bMin, self._bMax = getMaxMinDigits(digit2)
此处的优点与之前类似 - 主要是您只创建一个operatorDict,而不是每个m
实例创建一个。它也更加严格,因为这种形式实际上不允许通过子类化轻松更改operatorDict
。在某些情况下,这种刚性可能是理想的。此外,正如评论中提到的那些,如果您使用第二个选项,命名_operatorDict
以指示它是您的命名系统中的常量(例如pep8中的_OPERATOR_DICT
)可能是个好主意。< / p>