我正在编写一个类来处理一些数据和对该数据的操作:
class AstroData:
def __init__(self):
self.positions = numpy.array ([])
self.positions_coord_system = ""
def change_to_rad (self):
self.positions = deg_to_rad(self.positions)
然后我想对数据做一些事情,比如说将单位从度更改为弧度(我知道这是一个me脚的示例,但这说明了我的问题;另一个是更改坐标系)。我有一个功能可以将度数更改为弧度(或更改为坐标系):
def deg_to_rad(degree_vals):
return numpy.deg2rad (degree_vals)
我的问题是:我应该在方法中调用函数还是应该在方法中定义函数,例如
class AstroData:
def __init__(self):
self.positions = numpy.array ([])
self.positions_coord_system = ""
def change_to_rad (self):
self.positions = numpy.deg2rad (self.positions)
我想知道哪种是质量更好的解决方案,以及执行此操作的正确方法。当然,对于更复杂的功能,这将是我必须放入类中的大量代码。
答案 0 :(得分:1)
我认为这取决于情况。在这种情况下,我将确保存储为self.positions
的内容始终是一致的,即始终为度或始终为弧度。我不会随意切换它们。
然后,我将在该对象上使用两种方法,一种称为get_postitons_as_deg
,另一种称为get_positions_as_rad
,该方法转换值并返回它们(使self.positions
保持不变)。
然后,呼叫者可以决定如何获取这些值。
答案 1 :(得分:1)
这在某种程度上是基于意见的问题,但是在这样的情况下,我认为记住PEP 20的建议很有用:
显式优于隐式。
通过将deg_to_rad()
定义为类中的一种方法,您正在告诉世界“这是我的类应该做的事情”。即使只是将调用转发到执行某些操作的专用numpy
函数,它也会向使用您的代码的任何人发出“这是此类设计的目的”的声明。
那是
简单胜于复杂。
...
尽管实用胜过纯洁。
...
应该有一种-最好只有一种-显而易见的方法。
在我看来,如果您要在类deg_to_rad()
中包含方法AstroData
,则它将是类中的一个随机静态方法,该方法将成为数据结构。如果用户想要将度数转换为弧度的功能,通常已经为他们提供了一种解决方案(这是您正在使用的解决方案)。
代码更重要的方面之一是一致性,它在代码中具有重要意义,尤其是在创建要在程序中使用的数据结构时。您当前的工作方式可以是拥有两个不同类型数据之一的相同数据结构。如果有人尝试使用您的数据结构,那么他们需要提前知道它所保存的数据类型,否则他们将看到他们不想要的行为。
显式优于隐式
...
面对含糊不清的事物,拒绝猜测的诱惑。
正如其他答案所暗示的那样,处理此类实现问题的更好方法是始终以相同的方式存储数据,并且仅在调用者决定其所需方式时才更改格式。除了使用一种方法来更改存储的数据格式之外,还可以使用一些方法来更改返回的数据格式:
class AstroData:
def __init__(self):
self.positions = numpy.array ([])
self.positions_coord_system = ""
def get_positions_in_degrees(self):
return self.positions
def get_positions_in_radians(self):
return numpy.deg_to_rad(self.positions) # without modifying self.positions
您当然可以在必要时使用辅助方法,但理想情况下,所有内容都应对用户隐藏,除非对用户而言至关重要。您还可以使用函数的名称,无论使访问这些内容最清晰直接的方法是什么-但在使用过程中请勿更改数据存储的格式。
答案 2 :(得分:0)
我会回答,这取决于您是否在代码的其他部分中使用deg_to_rad
函数,除了change_to_rad
之外,正确的做法是将代码的那部分放在函数中( deg_to_rad
)。如果只有一个调用,而且很短,则可以不创建该函数。但是,即使您最好还是分开功能,所以如果必须进行更改,您将使用deg_to_rad
而不是change_to_rad
代码。