我正在定义一个代表向量的类:
'''
An entity with size and direction
'''
UNINITIALIZED = -1
class myVector():
def __init__(self,direction = UNINITIALIZED,size = UNINITIALIZED):
self.direction = direction
self.size = size
对于使用该课程,我想象两个场景:要么我知道启动时矢量的charecharistics,然后使用这些值启动它:
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方式是什么?
答案 0 :(得分: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
并执行相同的操作 - 这似乎不太明确我虽然意味着你不能使用可选的args。
答案 1 :(得分: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
答案 2 :(得分: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