将类作为其方法的默认参数传递

时间:2017-03-10 13:53:25

标签: python python-3.x oop

以下是此问题所需的最小Point类。

 class Point:
      def __init__(self, x = 0, y = 0):
           self.x = x
           self.y = y
      def dist_from(self, point = Point(0, 0)):
           return ((self.x-point.x)**2 + (self.y-point.y)**2)**0.5

如果没有传递点,我希望dist_from方法返回距原点的距离。由于无法进行方法重载,因此我决定将Point对象(原点)作为默认值传递。

但我错过了一些非常基本的东西。

Traceback (most recent call last):
  File "C:\Users\Naveen\Desktop\temp.py", line 26, in <module>
    class Point:
  File "C:\Users\Naveen\Desktop\temp.py", line 32, in Point
    def dist_from(self, point = Point(0, 0)):
NameError: name 'Point' is not defined

1 个答案:

答案 0 :(得分:3)

默认值是在编译函数对象时被评估的表达式。 Point的查找将失败,因为此时尚未创建名为Point的类。

这可以通过为默认值提供默认值None并在方法体内对其进行操作(已定义名称Point)来进行侧面步骤:

def dist_from(self, point = None):
      if point is None:
          point = type(self)(0, 0)  # Could do Point(0, 0)
      return (self.x*point.x + self.y*point.y)**0.5

我在这里使用type(self)而不是Point,以便不在那里对类名进行硬编码。