Vec*_*tor 4 python named-parameters
我创建了一个类,我想给用户(可能是我)两种不同的方法来初始化它.对于这个例子,该类被调用Box,我想用以下任一方式初始化它:
两组笛卡尔坐标,代表最小值和最大值(x,y).
一组笛卡尔坐标,表示最小值和方框尺寸
我可以通过使用命名参数来完成此操作,但是如果没有调用命名参数,我想引发错误.我的当前代码在调用pass_var没有命名参数的情况下调用伪参数.它有效,但我认为必须有更优雅或Pythonic的解决方案.
class Box(object):
def __init__(self, pass_var=None, coordinates=None, min_points=None, dimensions=None):
if coordinates:
setup_box_from_coordinates()
return
elif min_points and dimensions:
setup_box_from_dimensions()
return
raise NameError("Box Class needs to be initiated with 'coordinates='' or 'min_pts= & dimensions='"
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Python 3.x,则可以使用它*来防止不需要的位置参数:
class Box(object):
def __init__(self, *, coordinates=None, min_points=None, dimensions=None):
...
Run Code Online (Sandbox Code Playgroud)
在2.x中,您不会自动获得错误,但可以执行以下操作:
class Box(object):
def __init__(self, *args, coordinates=None, min_points=None, dimensions=None):
if args:
raise TypeError('positional arguments not supported')
...
Run Code Online (Sandbox Code Playgroud)
但是,提供创建类的不同方法的传统方法是使用类方法,例如:
class Box(object):
@classmethod
def from_coordinates(cls, coordinates):
...
@classmethod
def from_min_dimensions(cls, min_, dimensions):
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |