4

我正在定义一个代表向量的类:

'''
An entity with size and direction
'''
UNINITIALIZED = -1

class myVector():    
    def __init__(self,direction = UNINITIALIZED,size = UNINITIALIZED):
        self.direction = direction
        self.size = size

对于使用该类,我设想了 2 个场景:要么我知道向量在启动时的特性,然后用这些值启动它:

v = myVector(4,2)

或者我在启动时不知道这些,然后我很高兴它将获得默认值。

然而,通过上述实现,实现了第三种情况——仅使用第一个参数启动向量:

v = myVector(4)

在这种情况下,只有第二个参数 ( size ) 将被分配默认值,并且生成的对象没有多大意义。

正如我所看到的,在这种情况下所需的行为是使用两个参数或不使用。实现这一点的一种方法是在这种情况下引发异常。

def __init__(self,direction = UNINITIALIZED,size = UNINITIALIZED):
    if (direction != UNINITIALIZED) and (size == UNINITIALIZED):
        raise Exception('Use both parameters or none') 
    self.direction = direction
    self.size = size

你认为优雅地做到这一点的pythonic方式是什么?

4

3 回答 3

3

大小和方向对我来说就像一个元组:

class myVector():    
    def __init__(self, sd=(UNINITIALIZED, UNINITIALIZED)):
       try:
           self.size, self.direction = sd
       except (ValueError, TypeError) as e:
           raise ValueError('two values of size and direction must be specified')

如果不需要默认值,则使用大小和方向的元组调用它。

如果您不想将语义更改为需要传递一个元组,那么如果您不使用其他参数,另一种方法是将 sd 更改为*args并做同样的事情 - 虽然这对我来说似乎不太明确并且意味着您不能将可选参数用于其他任何事情。

于 2013-07-23T07:52:37.290 回答
1

您还可以像这样定义类:

class myVector():
    def __init__(self,*direction_and_size):
        if not len(direction_and_size):
            direction_and_size = [UNINITIALIZED, UNINITIALIZED]
        assert len(direction_and_size) == 2, "Please provide both parameters"
        self.direction,  self.size = direction_and_size

>>> v = myVector()
>>> v = myVector(4,2)
>>> v = myVector(4)
AssertionError: Please provide both parameters
于 2013-07-23T07:55:44.863 回答
1

像这样的东西?

class myVector():
    def __init__(self, direction = -1, size = -1):
        if (-1 in (direction, size)):
            self.size, self.direction = (-1, -1) #do your own fault/error handling here
                                                 #this just makes the example easier
        else:
            self.size = size,
            self.direction = direction

c1 = myVector(1, 1)
c2 = myVector(1)
c3 = myVector()

print(c1.direction, c2.direction, c3.direction)

输出:
1 -1 -1

于 2013-07-23T08:16:32.903 回答