2017-03-13 24 views
1

私はこの問題の答えを探しましたが、答えが見つからない、あまりにも具体的ではないかもしれません。オブジェクトに属性がありません - Pythonクラスの実行

私は簡単なプログラム、私の最初の適切なプログラムを持っていると私は練習として、主にそれを作成しました:私はすべてのprint文をコメント解除し、それらを同時に実行すると

import math 

class Logs(object): 

    def __init__(self,a,b): 
    self.a = a 
    self.b = b 

    def apply_log(self): 
    self.a_log = math.log10(self.a) 
    self.b_log = math.log10(self.b) 
    return (self.a_log, self.b_log) 

    def add_log(self): 
    self.log_add = self.a_log + self.b_log 
    return self.log_add 

    def log_split(self): 
    self.log_c = self.log_add // 1 
    self.log_m = self.log_add % 1 
    return(self.log_c, self.log_m) 

    def result(self): 
    self.ex_m = 10 ** self.log_m 
    self.ex_v = 10 ** self.log_c 
    self.log_res = self.ex_m * self.ex_v 
    return self.log_res 

lg = Logs(34,54) 
#print(lg.apply_log()) 
#print(lg.add_log()) 
#print(lg.log_split()) 
print(lg.result()) 

プログラムが完全に実行されます。それぞれの結果をプリントアウトするとき、それがうまくいく理由を私は理解していない

Traceback (most recent call last): 
    File "python", line 33, in <module> 
    File "python", line 24, in result 
AttributeError: 'Logs' object has no attribute 'log_m' 

:私はちょうどインスタンスの結果を印刷し、他の三つのprint文をコメントアウトしたい場合は、それがエラーをスローしますまたはなぜこれがプログラムの実行方法に影響を与えるかを示します。

私はクラスを使用したのは初めてです(プログラムのポイントはクラスを作成するための練習でした)ので、エラーは私が作成した方法であると想像します。

ご協力いただければ幸いです。それはlog_mの方法log_splitに初期化方法resultで使用されているためAttributeErrorをスローする必要があります

おかげ

+1

'self.log_m'が作成される前に' lg.result() 'を呼び出しています。コメントアウトしたプリントを削除しても問題ありません。 – MooingRawr

答えて

4

。前もってlog_splitを呼び出すことなくresultを呼び出すと、log_mが定義されておらず、表示されているエラーが発生します。このクラスは、resultlog_splitの後にしか呼び出されないように設計されています。

0

log_mは、log_split(self)関数内のローカル変数です。

結果(自己)関数の内部では、log_mとlog_cは関数にとって未知の2つの変数です。

したがって、まずlog_split()を実行してからresult()を実行する必要があります。

0

log_mの値はlog_split方法で初期化され、それはadd_log方法で初期化されlog_addの値に依存しています。さらに、log_addは、a_logおよびb_logの値に依存し、これらは、方法で初期化される。したがって、メソッドの3つの実装をすべてコメントすると、AttributeErrorが表示されます。 メソッド呼び出しのシーケンスを維持する必要があります。そうしないと、メソッドのいずれかにコメントするとエラーが発生します。

+0

答えをいただきありがとうございます。プリントせずに呼び出しシーケンスを維持する方法はありますか?または、おそらくクラスの再設計が必要です... – Reykholt

+0

あなたは単にprintステートメントを削除することができます、それはうまく動作します。 –

関連する問題