回転楕円体の長半径と短半径の2つのパラメータに基づいてさまざまな量を計算するPythonスクリプトを作成しています。これを行うために回転楕円体クラスを作成できることに気づきました。しかし、私はオブジェクト指向デザインに不慣れであり、より経験豊富なチャップスが私を助けることができるかどうか疑問に思います。
インスタンスは、長半径と短半径のそれぞれのパラメーターaとbでインスタンス化されるため、クラスを次のように設計しました。
class Spheroid:
def __init__(self,a,b):
self.longax = a
self.shortax = b
計算したい量の1つはボリュームです。回転楕円体の体積は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.
どちらを使用するのが良いですか、そしてその理由は何ですか?一般に、いつメソッドを使用し、いつ属性を使用しますか?普段は気にしないのですが、実装するものがたくさんあるので、今後の参考のためにオブジェクト指向デザインについて考えてみたいと思います。
ありがとう
編集:
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:'回転楕円体'オブジェクトに属性'ボリューム'がありません
私はここで何が間違っているのですか?
また、私のinitメソッドでは、a/bの代わりにself.alpha=self.longax / self.shortaxを使用しましたが、これは何か違いがありますか?片道が望ましいですか?