2017-06-01 48 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和我一直在做一些练习lately.I跨越一个问题来了,我已经写了same.But我反复得到代码错误:“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

一个问题。现在根据你的代码,所有的方法是独立的吗? – mathers25

+0

号码开始和跑步是你课堂时间的对象。要访问类Time的add_time方法,您需要另一个对象,因此我创建了一个TimeObject来访问add_time方法。不过,我建议你使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修饰)并在某些函数/实例化类中执行代码时,类级别中的代码正在执行。如果这是简单的脚本,也可以在顶层(模块)级别执行它。你的片段是“不好的练习”:类级别(我正在讨论缩进)是用于声明,而不是用于执行某些事情。在类级别上正常执行类似于C宏的代码:例如,调用装饰器,转换某些方法/属性/等 - 静态的“纯”函数!

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个ARGS它可以正常工作,只要:

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),那么您将需要缩进一个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)