关于oop:python中类定义的预期行为

Expected behavior of class definition in python

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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"没有一个点对象作为中心。如果圆对象中有一个方法使用中心对象进行计算(例如计算圆的面积),则B对象将失败。我必须强制类型还是程序员在实例化时提供预期的对象类型?


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

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

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


由您来强制类型,由调用者来提供正确的数据。

Python社区的一个基本理念是,我们都是负责任的程序员。如果强制类型以防止意外或恶意错误很关键,则必须将其构建到对象中。