Why should I use classes in python?
我是一个非常业余的Python学习者,最近我开始学习课程的概念。我可以大致理解类的概念,但我不明白为什么我不能简单地写一些函数而不是写一个类?
例如,(我从交互式Python学习)给出的练习之一(我应该用一个类来写)是:
添加一个与
将方法
他们使用如下类编写代码:
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坐标,您的应用程序需要知道每个点是什么颜色。
如果编写代码将每个点存储为一个元组(
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)) |
所有与
可以在类外部声明函数。但是在编程中,将它们存储在类中是一种更好的实践。OOP被认为更具可读性和可重用性。
在这种情况下,两点之间的距离取决于点,所以在这个类中使用DistanceFromPoint方法是合乎逻辑的。
类还允许您确定距离点的距离,而不是包含错误值(如两个以上坐标)的元组的距离。
你举的一个例子对于证明类的使用是错误的。
类是描述事物的一种很好的方式,而不是操作数据。所以一个点只有两位信息来描述它(在二维空间中)。
想想更抽象的东西,比如电影文件。电影有各种各样的相关信息:标题,持续时间,流派,演员,年龄,流行度,语言,奖项…继续。尝试编写处理所有这些信息的长列表的函数,您将很快看到类的优点。
数学也许是一个没有那么多上下文信息的领域,只有几个变量,它们定义了一切。现实世界中的数据定义不太清楚,因此从类的可扩展性中获益。
功能和面向对象编程是不同的范例。
在python中,一切都是一个对象,甚至是