关于类:我为什么要在python中使用类?

Why should I use classes in python?

我是一个非常业余的Python学习者,最近我开始学习课程的概念。我可以大致理解类的概念,但我不明白为什么我不能简单地写一些函数而不是写一个类?

例如,(我从交互式Python学习)给出的练习之一(我应该用一个类来写)是:

  • 添加一个与distanceFromOrigin类似的distanceFromPoint方法,只不过它以Point作为参数并计算该点与自身之间的距离。

  • 将方法reflect_x添加到Point中,该方法返回新的Point,该方法是关于x轴的点的反射。例如,Point(3, 5).reflect_x()(3, -5)

  • 他们使用如下类编写代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import math

    class Point:
       """ Point class for representing and manipulating x,y coordinates."""

    def __init__(self, initX, initY):
       """ Create a new point at the given coordinates."""
        self.x = initX
        self.y = initY

    def getX(self):
        return self.x

    def getY(self):
        return self.y

    def distanceFromOrigin(self):
        return ((self.x ** 2) + (self.y ** 2)) ** 0.5

    def distanceFromPoint(self, otherP):
        dx = (otherP.getX() - self.x)
        dy = (otherP.getY() - self.y)
        return math.sqrt(dy**2 + dx**2)

    p = Point(3, 3)
    q = Point(6, 7)

    print(p.distanceFromPoint(q))

    当我可以这样简单地写它们时,我为什么要使用类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    def distanceFromPoint(p,q): # they are tuples
        y = (p[0]-q[0])**(2)+(p[1]-q[1])**(2)
        return y**(1/2)

    def reflectx(p):
        return (p[0],-p[1])

    p = (3,3)
    q = (6,7)


    使用OOP的一大优点是可扩展性。

    假设您编写了一个以点的形式处理大量数据的应用程序。现在您的客户添加了规范,以及每个点的X和Y坐标,您的应用程序需要知道每个点是什么颜色。

    如果编写代码将每个点存储为一个元组((x, y)),则可以将颜色作为第三个值添加:(x, y, colour)。但是现在你必须检查你所有的代码,找出它被破坏的地方,因为你改变了数据格式。如果您使用了一个类,您可以简单地定义一个继承自Point的新类,并添加必要的功能:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class ColouredPoint(Point):
       """ Class for points which are coloured, based on Point"""

        def __init__(self, initX, initY, initCol):
            Point.__init__(self, initX, initY)
            self.colour = initCol

    p = ColouredPoint(3, 3,"green")
    q = ColouredPoint(6, 7,"red")
    r = Point(8, 4)

    print(p.distanceFromPoint(q))
    print(p.colour)
    print(p.distanceFromPoint(r))

    所有与Point类一起使用的代码仍然可以与新类一起使用,即使您没有编写或不能更改Point类的定义,也可以这样做。


    可以在类外部声明函数。但是在编程中,将它们存储在类中是一种更好的实践。OOP被认为更具可读性和可重用性。

    在这种情况下,两点之间的距离取决于点,所以在这个类中使用DistanceFromPoint方法是合乎逻辑的。

    类还允许您确定距离点的距离,而不是包含错误值(如两个以上坐标)的元组的距离。


    你举的一个例子对于证明类的使用是错误的。

    类是描述事物的一种很好的方式,而不是操作数据。所以一个点只有两位信息来描述它(在二维空间中)。

    想想更抽象的东西,比如电影文件。电影有各种各样的相关信息:标题,持续时间,流派,演员,年龄,流行度,语言,奖项…继续。尝试编写处理所有这些信息的长列表的函数,您将很快看到类的优点。

    数学也许是一个没有那么多上下文信息的领域,只有几个变量,它们定义了一切。现实世界中的数据定义不太清楚,因此从类的可扩展性中获益。


    功能和面向对象编程是不同的范例。

    在python中,一切都是一个对象,甚至是ints。整个语言都倾向于面向对象的编程,这就是为什么您应该选择它,特别是如果您的程序会增长的话。