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

时间:2016-04-15 07:19:51

标签: python class oop

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

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

  1. 添加distanceFromPoint方法,其工作方式与distanceFromOrigin类似,只是它需要Point作为参数,并计算该点与自身之间的距离。

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

  3. 他们使用以下类编写代码:

    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))
    

    为什么我应该使用类,因为我可以像这样编写它们:

    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)
    

4 个答案:

答案 0 :(得分: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))

Point类一起使用的所有代码仍然适用于新类,即使您没有编写或不能更改{{1 }。class。

答案 1 :(得分:4)

您可以在类之外声明一个函数。 但是在课堂上存储它们在编程方面通常是更好的实践。 OOP被认为更具可读性和可重用性。

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

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

答案 2 :(得分:1)

对于证明类的使用是合理的,你的例子是一个不好的例子。

类是描述什么是而不是操纵数据的好方法。所以一点只有两位信息描述它(无论如何在2D空间中)。

想一些更抽象的东西,比如电影文件。电影有各种与他们相关的信息:标题,持续时间,流派,演员,年龄等级,受欢迎程度,语言,奖励......继续。尝试编写处理所有这些信息的长列表的函数,您将很快看到类的优点。

数学可能是一个实际上没有太多上下文信息的领域,只有少数变量并且它们定义了所有内容。现实世界的数据定义不太明确,因此可以从类的可扩展性中获益。

答案 3 :(得分:-2)

Functionalobject-oriented编程是不同的范例。

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