我很确定已多次询问过这个问题,但我仍然不确定如何在Python中实现多个构造函数。我知道在python中,我只能有一个不同于java或C#或C ++的构造函数。我还是很新的。长话短说,我需要实现一个线对象。该线将由函数y = ax + b表示。因此,我需要在行中存储的唯一内容是a,b和布尔值,用于特殊情况,其中行是垂直的(a =无穷大)。在这种情况下,a将存储该行的x位置。要创建一条线,我有三种方法。 1是直接放入a,b和布尔值。 2是以元组的形式输入2个点。 3是放入点和矢量。到目前为止我的代码:
< c
不确定是否有更好的方法来执行此操作
答案 0 :(得分:6)
<强>更新强>
根据@classmethod
的建议,使用Jim执行多个构造函数的pythonic方式越多。 Raymond Hettinger在Pycon 2013上就Python的类开发工具包进行了演讲,在那里他使用@classmethod
讨论了multiple constructors。
class Line:
def __init__(self, a, b, noSlope):
self.a = a
self.b = b
self.noSlope = noSlope
@classmethod
def fromPoints(cls, point1, point2):
deltaX = point2[0] - point1[0]
deltaY = point2[1] - point1[1]
if deltaX == 0:
return cls(point1[0], 0, True)
else:
a = deltaY / deltaX
b = point1[1] - a * point1[0]
return cls(a, b, False)
@classmethod
def fromVector(cls, vector, point):
if vector[0] == 0:
return cls(point1[0], 0, True)
else:
a = vector[1] / vector[0]
b = point1[1] - a * point1[0]
return cls(a, b, False)
line = Line.fromPoints((0,0), (1,1))
与self
类似,cls
函数的@classmethod
参数隐式传递为调用类(在上面的示例中,它将是Line
)。这用于使用其他构造函数来适应未来的子类;它通过硬编码基类代替cls
来消除潜在的错误,从而意外绕过子类的构造函数实现。
原始帖子:
如果要强制使用构造函数,可以使它们static methods,并让它们返回类的实例。
class line:
def __init__(self, a, b, noSlope):
self.a = a
self.b = b
self.noSlope = noSlope
@staticmethod
def lineFromPoints(point1, point2):
deltaX = point2[0] - point1[0]
deltaY = point2[1] - point1[1]
if deltaX == 0:
return line(point1[0], 0, True)
else:
a = deltaY / deltaX
b = point1[1] - a * point1[0]
return line(a, b, False)
@staticmethod
def lineFromVector(vector, point):
if vector[0] == 0:
return line(point1[0], 0, True)
else:
a = vector[1] / vector[0]
b = point1[1] - a * point1[0]
return line(a, b, False)
# Create instance of class
myLine = line.lineFromPoints((0,0), (1,1))
编辑:
如果要强制使用构造函数而不是Line.__init__
的使用,可以使用以下工厂隐藏Line类的直接实例化:
class LineFactory:
class Line:
def __init__(self, a, b, noSlope):
self.a = a
self.b = b
self.noSlope = noSlope
@staticmethod
def fromPoints(point1, point2):
deltaX = point2[0] - point1[0]
deltaY = point2[1] - point1[1]
if deltaX == 0:
return LineFactory.Line(point1[0], 0, True)
else:
a = deltaY / deltaX
b = point1[1] - a * point1[0]
return LineFactory.Line(a, b, False)
@staticmethod
def fromVector(vector, point):
if vector[0] == 0:
return LineFactory.Line(point1[0], 0, True)
else:
a = vector[1] / vector[0]
b = point1[1] - a * point1[0]
return LineFactory.Line(a, b, False)
# Create line
line = LineFactory.fromPoints((0,0), (1,1))
答案 1 :(得分:0)
您可以使用默认值None:
创建一个包含所有必需参数的构造函数class line:
def __init__(self, a = None, b = None, noSlope = None, point1 = None, point2 = None, vector = None, point = None):
pass
然后,您将检查在构造函数中传递哪些参数,并从这些参数创建行。
答案 2 :(得分:0)
您可以使用Pyhton的枚举声明初始化方法,如下所示:
from enum import Enum
class Line:
class InitTypes(Enum):
coefs, point_vector, point_point, vertical = range(4)
def __init__(self, a, b, method):
self.noSlope = False
if method == Line.InitTypes.coefs:
self.a = a
self.b = b
elif method == Line.InitTypes.point_vector:
# Do math
pass
elif method == Line.InitTypes.point_point:
# Do math
pass
elif method == Line.InitTypes.vertical:
self.noSlope = True
self.a = a
self.b = b
else:
assert(False)
然后,按如下方式创建一行:
x = Line((0,1), (3,4), Line.InitTypes.point_point)