【问题标题】:Expected behavior of class definition in pythonpython中类定义的预期行为
【发布时间】:2016-02-21 15:56:23
【问题描述】:

我阅读了多篇关于 Python 中 OOP 的文章,但没有找到答案。 这是我的示例代码作为示例:

class Point(object):
    """basic point"""
    def __init__(self, x, y):
        self.x = x
        self.y = y


class Circle(object):
    """basic circle object"""
    def __init__(self,center,radius):
        self.center = center  #should be a point object
        self.radius = radius

coord = Point(1, 2)
a = Circle(coord, 4)
b = Circle(4, 5)

如果我理解正确,这是有效的 Python 代码,但圆圈“b”没有以 Point 对象为中心。如果圆对象中有一个方法使用中心对象进行计算(例如计算圆的面积),则 b 对象将失败。我必须强制类型还是程序员有责任在实例化时提供预期的对象类型?

【问题讨论】:

  • @jonrsharpe:我不确定这是正确的副本。这个问题更像是“我是否必须实现类型检查”,但受骗者是“我如何实现类型检查”。
  • 没错,更多的是关于我必须这样做。我认为最好检查对象定义中的类型,这样每次实例化它时都会更容易捕捉到我的错误,但我不确定它是否是 python 方式。

标签: python oop


【解决方案1】:

正如其他人所说,强制输入由您决定。

但是,Python 广泛使用 duck typing 的概念,这意味着在您的情况下,您不一定需要 Point 对象作为中心,您只需要 行为与您的 Point 类相同。在这个简单的例子中,Point 没有提供任何方法;它只是一个类,其对象将具有xy 属性。这意味着您的Circle 可以为它的center 接受any 对象,只要它提供xy 属性,即提供相同的接口作为Point

这意味着最重要的事情是记录你的类提供什么接口,以及每个函数或方法期望从它的参数中得到什么。

【讨论】:

    【解决方案2】:

    您可以强制执行类型,并由调用者提供正确的数据。

    python 社区的基本理念之一是我们都是负责任的程序员。如果强制执行该类型以防止意外或恶意错误至关重要,则必须将其构建到您的对象中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-17
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多