Python中处理大量实例属性时的代码设计
Code Design when Dealing with Large Numbers of Instance Attributes in Python
所以我正在 Python 中编写一个程序,而且它变得相当长。当我扩展它时,我开始注意到我的一些 类 获得了许多属性,并且我以一种感觉不太理想的方式将它们传递给 __init__。例如,这就是我所说的:
class Enemy(Ship):
def __init__(self,m=20000,size=32,F=[0,0],X=[0,0],v=[0,0],a=[0,0],p=[0,0],
tau=0,theta=0,omega=0,alpha=0,I=850000,rel_X_cm=[16,16],sprites=[pygame.image.load("core_off.png"),pygame.image.load("core_on.png")],
health=0,module_type="Thruster",module_coordinates=[0,0],core_module=None,
module_orientation=0,F_max=[4000000,0],tau_max=0,
attached_modules=[],surrounding_points = [[1,0],[0,1],[-1,0],[0,-1]]):
super(Enemy,self).__init__(m,size,F,X,v,a,p,tau,theta,
omega,alpha,I,rel_X_cm,sprites,
health,module_type,module_coordinates,
core_module,module_orientation,F_max,tau_max,
attached_modules,surrounding_points)
这显然很混乱,我希望简化我的代码。所以我的问题是,有没有比我现在做的更好的方法来处理所有这些变量?
这正是解包参数的用途。在这种情况下,由于您要传递 keyword arguments 您可以使用 **kwargs
:
def __init__(self,**kwargs):
# do stuff with kwargs[X] which X is the name of your argument
对于您的 positional arguments,您可以使用一个星号前缀 *args
,这样您就可以将任意参数列表传递给函数:
def __init__(self,*args):
# then you can loop over the args in order to achieve to arguments
所以我正在 Python 中编写一个程序,而且它变得相当长。当我扩展它时,我开始注意到我的一些 类 获得了许多属性,并且我以一种感觉不太理想的方式将它们传递给 __init__。例如,这就是我所说的:
class Enemy(Ship):
def __init__(self,m=20000,size=32,F=[0,0],X=[0,0],v=[0,0],a=[0,0],p=[0,0],
tau=0,theta=0,omega=0,alpha=0,I=850000,rel_X_cm=[16,16],sprites=[pygame.image.load("core_off.png"),pygame.image.load("core_on.png")],
health=0,module_type="Thruster",module_coordinates=[0,0],core_module=None,
module_orientation=0,F_max=[4000000,0],tau_max=0,
attached_modules=[],surrounding_points = [[1,0],[0,1],[-1,0],[0,-1]]):
super(Enemy,self).__init__(m,size,F,X,v,a,p,tau,theta,
omega,alpha,I,rel_X_cm,sprites,
health,module_type,module_coordinates,
core_module,module_orientation,F_max,tau_max,
attached_modules,surrounding_points)
这显然很混乱,我希望简化我的代码。所以我的问题是,有没有比我现在做的更好的方法来处理所有这些变量?
这正是解包参数的用途。在这种情况下,由于您要传递 keyword arguments 您可以使用 **kwargs
:
def __init__(self,**kwargs):
# do stuff with kwargs[X] which X is the name of your argument
对于您的 positional arguments,您可以使用一个星号前缀 *args
,这样您就可以将任意参数列表传递给函数:
def __init__(self,*args):
# then you can loop over the args in order to achieve to arguments