我有一个表示算法参数选项的类。创建对象会将所有选项初始化为某些预定义值。然后,我可以通过简单地为相应的属性指定不同的值来更改参数:
opts = AlgOptions()
opts.mutation_strength = 0.2
但是,有时在键入属性名称时会出错,例如:
opts = AlgOptions()
opts.mutation_str = 0.2
Python只是创建了一个不同的属性并继续运行,产生了难以调试的意外结果。你知道吗
有没有一个优雅的方法来避免这种潜在的陷阱?总是重复检查所有属性名感觉很枯燥,而像C#这样的语言会将这种情况解释为错误。我想起来的事情很少,但有一些注意事项:
1)我可以为参数创建setter方法,但这似乎是很多样板代码。这样,如果我试图用错误的名称调用一个方法,我将得到一个有意义的exepion。你知道吗
2)我可以创建类内所有属性的列表,并检查是否有名称不在列表中的类属性。但是,我不确定在什么地方和什么时候执行检查,而且这似乎是一个笨拙的解决方案。你知道吗
所以一般来说,最好是避免打字错误;)但这里有一个(稍微有点黑)的解决方案。基本上是对
NoSetAttr
类进行子类化,并使用set_new_attr
方法在类中设置新属性。你知道吗您可以将基类转换为类装饰器
@no_set_attr
,然后对类进行注释,这可能会更简单。你知道吗您可以通过使用slots来实现这一点,这基本上可以防止创建未在
__init__
中声明的属性:注意,使用
__slots__
有文档中讨论的一些缺点。你知道吗以下是一种只允许设置某些属性的可能方法:
就我个人而言,我永远不会在我的代码中使用这样的东西。我不喜欢这种试图“对抗”语言的方法。。。记住,python不是c#。你知道吗
相关问题 更多 >
编程相关推荐