我正在编写一个 python 脚本,它根据两个参数计算各种数量,即球体的长半径和短半径。我突然想到我可以编写一个球体类来做到这一点。但是,我是面向对象设计的新手,想知道您是否更有经验的小伙子可以帮助我。
一个实例分别用参数 a 和 b 为长半径和短半径实例化,所以我设计的类如下:
class Spheroid:
def __init__(self,a,b):
self.longax = a
self.shortax = b
我要计算的数量之一是体积。球体的体积为 4*pi/3 * a * b * b。
我的问题是,我是否在我的类中为此定义了方法或属性?
例如我可以定义一个方法:
def Volume(self):
return 4*pi/3 * self.longax * self.shortax * self.shortax
或者我可以只使用一个属性:
self.volume = 4*pi/3 * self.longax * self.shortax * self.shortax
我也可以将它包含在 init 方法中:
class Spheroid:
def __init__(self,a,b):
self.longax = a
self.shortax = b
self.volume = 4*pi/3 * a * b * b.
哪个更好用,为什么?一般来说,我什么时候使用方法,什么时候使用属性?我通常不会在意,但我有一大堆要实现的东西,我想对 OO 设计有一个想法,以供将来参考。
谢谢
编辑:
在按照 Martijn 的建议实现属性后,我得到了这样的结果:
class Spheroid(object):
def __init__(self,a,b):
self.shortax = a
self.longax = b
self.alpha=self.longax/self.shortax
@property
def volume(self):
return (4*np.pi/3) * self.shortax * self.shortax * self.longax
@property
def epsilon(self):
return np.sqrt(1-self.alpha**(-2))
@property
def geometricaspect(self):
return 0.5 + np.arcsin(self.epsilon)*0.5*self.alpha/self.epsilon
@property
def surfacearea(self):
return 4*np.pi*self.shortax**2*self.geometricaspect
我实例化了一个实例 s = Spheroid() 但每当我尝试像 s.volume 或 s.epsilon 这样的东西时,我都会得到一个 AttributeError:
AttributeError:“球体”对象没有属性“体积”
我在这里做错了什么?
另外,在我的初始化方法中,我使用了 self.alpha = self.longax/self.shortax 而不是 a/b,这有什么区别吗?一种方式更可取吗?