我创建了一个类,我想给用户(可能是我)两种不同的初始化方法。对于此示例,该类称为 Box,我想使用以下任一方法对其进行初始化:

  • 两组笛卡尔坐标,分别代表 min 和 max (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='"
    

    最佳答案

    如果您使用的是 Python 3.x,则可以使用 * 来防止不需要的位置
    参数:

    class Box(object):
    
        def __init__(self, *, coordinates=None, min_points=None, dimensions=None):
            ...
    

    在 2.x 中,您不会自动收到错误,但可以执行例如:
    class Box(object):
    
        def __init__(self, *args, coordinates=None, min_points=None, dimensions=None):
            if args:
                raise TypeError('positional arguments not supported')
            ...
    

    但是,提供创建类的不同方法的常规方法是使用类方法,例如:
    class Box(object):
    
        @classmethod
        def from_coordinates(cls, coordinates):
            ...
    
        @classmethod
        def from_min_dimensions(cls, min_, dimensions):
            ...
    

    关于python - 在python函数中需要命名参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35521778/

    10-12 18:31
    查看更多