我是Python的业余学习者,最近我开始学习类的概念。我可以粗略地理解类的概念(非常),但是我不能理解为什么我不能简单地编写一些函数而不是写一个类?
例如,(我正在学习Interactive python)给出的一个练习(我应该用类写的)是:
添加distanceFromPoint
方法,其工作方式与distanceFromOrigin
类似,只是它需要Point
作为参数,并计算该点与自身之间的距离。
向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))
为什么我应该使用类,因为我可以像这样编写它们:
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)
答案 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)
Functional和object-oriented编程是不同的范例。
在Python中,一切都是对象,甚至是hash_behaviour = merge
。整个语言都倾向于面向对象的编程,这就是为什么你应该选择它,特别是如果你的程序会增长。