【发布时间】:2016-08-07 01:04:00
【问题描述】:
我是一个非常业余的 Python 学习者,最近开始学习类的概念。我可以(非常)大致理解类的概念,但我不明白为什么我不能简单地写一些函数而不是写一个类?
例如,(我正在向Interactive python 学习)给出的练习之一(我应该使用类来编写)是:
添加一个类似于
distanceFromOrigin的distanceFromPoint方法,不同之处在于它将Point作为参数并计算该点与自身之间的距离。向
Point添加一个方法reflect_x,它返回一个新的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)
【问题讨论】:
-
至少
getX和getY方法不被视为pythonic 代码。您可以直接访问x和y属性。 -
除了以下更一般的答案:您实际上并不需要 getX/getY。 Python 没有真正的私有成员,所以只使用 x/y 是可以的。如果您需要覆盖它们,属性始终可用。
-
@Matthias:我是 python 新手。我不明白什么是 Python 代码,为什么 getX、getY 不是 Python 代码?
-
你不需要为什么是或不是'Pythonic'而失眠,但我希望你看到
mypoint.x比mypoint.getX()更简单、更清晰。但是,很难用这样一个简单的例子来说明 OOP 的力量。直到我有一个真正的问题要解决,我才真正“明白”,我突然意识到,如果我编写一个继承自其他人先前定义的类的类,这将是非常简单的。 -
@nekomatic:能否请您提一下 Python OOP 中的其中一个练习,它使您进入“啊哈”时刻?