我在初始化期间只使用一次的字典是否应该放在我的 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
)可能是一个好主意。
我只需要使用一次 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
)可能是一个好主意。