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

18 python oop class

我是Python的业余学习者,最近我开始学习类的概念.我可以粗略地理解类(非常)的概念,但我无法理解为什么我不能简单地编写一些函数而不是编写一个类?

例如,(我正在从Interactive python中学习)给出的练习之一(我应该使用类编写)是:

  1. 添加一个distanceFromPoint类似的方法,distanceFromOrigin除了它将a Point作为参数并计算该点与self之间的距离.

  2. 添加一个返回new 的方法reflect_x,Point该方法Point是关于x轴的点的反射.例如,Point(3, 5).reflect_x()(3, -5).

他们使用这样的类编写代码:

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))
Run Code Online (Sandbox Code Playgroud)

当我可以像这样编写它时,为什么要使用类:

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)
Run Code Online (Sandbox Code Playgroud)

nek*_*tic 16

使用OOP的一大优势是可扩展性.

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

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

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))
Run Code Online (Sandbox Code Playgroud)

您使用Point该类的所有代码仍然可以使用新类,即使您没有编写或无法更改Point类的定义,也可以执行此操作.


小智 3

您可以在类之外声明函数。但在编程中,将它们存储在类中通常是更好的做法。OOP 被认为更具可读性并且可重用。

在这种情况下,两点之间的距离取决于点,因此使用distanceFromPoint是合乎逻辑的在此类中

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