短い答えはすでに投稿されています。インスタンス変数( self.answer
)を使用します。
class QuadEq(object):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def solve_quad_eq(self):
self.answer = ("this", "that")
return self.answer
def show_result(self):
print self.answer
eq = QuadEq(1,2,3)
eq.solve_quad_eq()
eq.show_result()
大まかに言えば、インスタンス変数 (データ メンバー) は、その「所有者」 (この例では、 によって参照されるオブジェクト) の寿命と同じ寿命を持つ単なる変数ですeq
。
ここで、長い (そしてもう少し専門的な) 答えについて説明します。クラスを設計するときは、クラスの責任と状態について考える必要があります。簡単に言えば、あなたのクラスの目的は何ですか? 多かれ少なかれ関連するさまざまな機能の単なるコンテナですか?その場合、上記の答えは完全に受け入れられます。しかし、通常は、もう少し厳密にする必要があります。少なくとも、コードの理解可能性/保守性を向上させるためには。
ここにQuadEq
クラスがあります。その名前から、このクラスのインスタンスが1 つの方程式をモデル化していることがわかります。そのような方程式の根はその方程式のプロパティsolve_quad_eq
なので、メソッドをそのクラスのメソッドにすることは許容できると思います。わずかな変更により、より一般的な名前を使用しますsolve
。なんで?それは、同じセマンティックを提供するさまざまな方程式の将来のクラスを提供するためです。さらに、結果を返すこととインスタンス変数に格納することの両方が混乱を招く可能性があります。ここで選択する必要があります。あなたの関数が根を返すこともあれば、根の数を返すこともあるという事実は言うまでもありません(0
)。
さて、印刷。私はこれについてもっと懐疑的です。表示自体は、方程式の「ネイティブ」プロパティではありません。そして、そのようにすれば、すぐに「方程式」とはまったく関係のない問題を方程式クラスで処理する必要があります。ファイルに書き込む方法は? バイナリまたはテキスト? どのエンコーディングを使用すればよいですか? I/O エラーに対処するには? 等々...
したがって、もし私があなたなら、関心の分離を推進し、ルートを返すための「アクセサ」メソッドだけを提供し、それらを外部から表示します。これは重要なように思われるので、ここではアクセサとsolve
メソッドを分離しておきます (ある種の方程式では計算量が多くなる可能性があります)。インスタンス変数self.answer
を単にキャッシュとして使用する ( memoization )
完全な例を次に示します。
class Eq(object):
def __init__(self):
self.answer = None # this should be calles "roots", no?
def roots(self):
if self.answer is None:
self.solve()
return self.answer
class QuadEq(Eq):
def __init__(self, a, b, c):
Eq.__init__(self)
self.a = a
self.b = b
self.c = c
def solve(self):
self.answer = ("this", "that")
return 2
eq = QuadEq(1,2,3)
print(eq.roots())
プログラムで解く別の種類の方程式を簡単に追加できるようになったことに注目してください...
class OtherEq(Eq):
def __init__(self, a, b, c):
Eq.__init__(self)
self.a = a
self.b = b
self.c = c
def solve(self):
self.answer = ( "it", )
return 1
...そしてさらに重要なことに、その新しい種類の方程式を使用するコードは、前のものとほとんど同じです。
eq = OtherEq(1,2,3)
print(eq.roots())