我在初始化期间只使用一次的字典是否应该放在我的 class 中?

Should a dict that I use only once during initialization be put inside my class?

我只需要使用一次 operatorDict 就可以确定我正在为 class 使用哪种操作。在 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)

这在很大程度上取决于您想要公开多少 operatorDict。在这种情况下,我可能会推荐以下两种方法之一。

选项 1:将字典放在 class:

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 不会在 class 内部发生变异,因此似乎没有必要将其作为实例属性。但是,从某种意义上说,它仍然属于class。这种方法还允许您根据需要更改 operatorDict(例如,在 subclass 中)。

选项 2:将字典放入全局命名空间:

_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 实例创建一个。它也更严格一点,因为这种形式实际上不允许通过 subclassing 轻松更改 operatorDict。在某些情况下,这种刚性可能是理想的。此外,正如评论中的一些人指出的那样,如果您使用第二个选项,命名 _operatorDict 以表明它在您的命名系统中是一个常量(例如 pep8 中的 _OPERATOR_DICT )可能是一个好主意。