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)

または、開始時にこれらを知らないので、デフォルト値を取得できることを嬉しく思います。

ただし、上記の実装では、3 番目のシナリオが実現されます。最初の引数のみを使用してベクトルを開始します。

v = myVector(4)

この場合、2 番目のパラメーター ( size ) のみにデフォルト値が割り当てられ、結果のオブジェクトはあまり意味がありません。

私が見ているように、この場合の望ましい動作は、両方のパラメーターを使用するか、何も使用しないことです。これを実装する 1 つの方法は、このような場合に例外を発生させることです。

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

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 に答える