2017-06-01 13 views
3
class Time: 

    def __init__(self,x,y,z): 
     self.hour=x 
     self.minute=y 
     self.second=z 

    def __str__(self): 
     return "({:02d}:{:02d}:{:02d})".format(self.hour, self.minute, self.second) 

    def time_to_int(time): 
     minutes=time.hour*60+time.minute 
     seconds=minutes*60+time.second 
     return seconds 

    def int_to_time(seconds): 
     time=Time() 
     minutes,time.second=divmod(seconds,60) 
     time.hour,time.minute=divmod(minutes,60) 
     return time 

    def add_time(t1,t2): 
     seconds=time_to_int(t1)+time_to_int(t2) 
     return int_to_time(seconds) 

start=Time(9,45,00) 
running=Time(1,35,00) 
done=add_time(start,running) 
print(done) 

私はPythonの初心者です。最近、いくつかの練習をしています。私は質問に出くわしました。同じコードを書いています。エラー:「add_timeが定義されていません」。私はmain()メソッドを定義しようとしましたが、何も印刷しません。助けてください。クラスPythonの内部でメソッドを呼び出す

+1

あなたの問題を解決し、あなたのインデントを修正してください。 'time_to_int'はスタンドアロンの関数かクラスのメソッドであるはずですか?前者の場合は、クラス定義の外側で献身する必要があります。 – BrenBarn

答えて

3

上記のクラスにオブジェクトを作成していません。

クラス内の任意の関数/メソッドは、そのクラスのオブジェクトによってのみアクセスできます。オブジェクト指向プログラミングの基本については、thisページを参照してください。

class Time: 

def __init__(self,x=None,y=None,z=None): 
    self.hour=x 
    self.minute=y 
    self.second=z 

def __str__(self): 
    return "({:02d}:{:02d}:{:02d})".format(self.hour, self.minute, self.second) 

def time_to_int(time): 
    minutes=time.hour*60+time.minute 
    seconds=minutes*60+time.second 
    return seconds 

def int_to_time(seconds): 
    time=Time() 
    minutes,time.second=divmod(seconds,60) 
    time.hour,time.minute=divmod(minutes,60) 
    return time 

def add_time(t1,t2): 
    seconds=time_to_int(t1)+time_to_int(t2) 
    return int_to_time(seconds) 

を、クラスブロックの外に、次の行書き込み:これが動作するために

一方、次のように自分のクラスを定義

TimeObject = Time() 
start=Time(9,45,00) 
running=Time(1,35,00) 
TimeObject.add_time(start,running) 
print "done" 

私はしかし、あなたが書くことをお勧めし同じクラス内の関数のパラメータとしてオブジェクトをクラスに渡しているため、オブジェクト指向プログラミングでは悪い設計と見なされるため、クラス外のadd_time関数を使用することはできません。 お手伝いをしてください。乾杯!

+0

1つの質問です。あなたのコードによれば、すべてのメソッドはスタンドアロンですか? – mathers25

+0

開始と実行はクラス時間のオブジェクトです。 Timeクラスのadd_timeメソッドにアクセスするには、別のオブジェクトが必要です。したがって、add_timeメソッドにアクセスするためにTimeObjectを作成しました。しかし、私はあなたがadd_timeメソッドを独立させ、残りをクラス内にすることをお勧めします。 – crazyglasses

+0

ここではTimeObjectを作成しましたが、初期化する必要があります。それ以外の場合はエラーが発生します。 – mathers25

-1

私の作品:

class C: 
    def f(a, b): 
    return a + b 
    x = f(1,2) 

print(C.x) 

しかし、あなたは、このようなことを行うべきではありません。クラスレベルのコードは、クラスが「作成中」のときに実行されます。通常は、静的メソッドまたはクラスメソッド(@staticmethodまたは@classmethodで飾られています)を使用し、関数/インスタンス化されたクラスでコードを実行します。これが単純なスクリプトであれば、top(モジュール)レベルで実行することもできます。あなたのスニペットは「悪い練習」です。クラスレベル(私はインデントについて話しています)は宣言用であり、何かの実行用ではありません。クラスレベルでは、Cマクロのアナログであるコードを実行するのが普通です:例えば、デコレータを呼び出したり、あるメソッド/属性/ etcを "純粋な"関数である静的なものに変換したりするのです!

1

あなたはそれができるあなたのコンストラクタ

def int_to_time(seconds): 
    time=Time(0,0,0) # just set your 3 positionals args here 
    minutes,time.second=divmod(seconds,60) 
    time.hour,time.minute=divmod(minutes,60) 
    return time 

を回避するための別の方法で3つの引数に指定されている。これは、限り、私のために正常に動作します:

class Time: 
    def __init__(self,x=0,y=0,z=0): 
     self.hour=x 
     self.minute=y 
     self.second=z 

あなたがあなたの機能を追加したい場合は、あなたの(例えば、time_to_int,int_to_time、さらにはadd_time)、1つ以上のレベルの4つの空白をインデントし、メソッドのパラメータにselfを追加する必要があります。

+0

ありがとう!私はそれを知っています。オブジェクトを使わずにクラスメソッドを呼び出そうとしていました。 – mathers25

1

斐伊川Mathers25、
私は、最高出力を得るために、コードの下にこれを試して

class TimeClass: 

def __init__(self,x,y,z): 
    self.hour = x 
    self.minute = y 
    self.second = z 

def __str__(self): 
    return "({:02d}:{:02d}:{:02d})".format(self.hour, self.minute, self.second) 

def time_to_int(self,time): 

    minutes = (time.hour * 60) + time.minute 
    seconds = (minutes * 60) + time.second 
    return seconds 

def int_to_time(self,seconds): 
    time = TimeClass(0,0,0) 
     minutes,time.second=divmod(seconds,60) 
     time.hour,time.minute=divmod(minutes,60) 
     return time 

def add_time(self,t1,t2): 
    seconds = self.time_to_int(t1) + self.time_to_int(t2) 
    # Call method int_to_time() using self keyword. 
    return self.int_to_time(seconds) 


# First time object create that time set value is 0 of hour,minute and second 
TimeObject = TimeClass(0,0,0) 

# After create second object 
start=TimeClass(9,45,00) 

# After create thired Object 
running=TimeClass(1,35,00) 

# Store the value which return by add_time() 
done = TimeObject.add_time(start,running) 

# Display the value of done variable 
print(done) 
関連する問題