在类Python中调用方法

时间:2017-06-01 07:01:21

标签: python class methods

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()方法但是它没有打印任何东西。请帮助。

4 个答案:

答案 0 :(得分: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函数,因为你将对象作为同一类中函数的参数传递给类,并且它被认为是面向对象编程中的错误设计。 希望能帮助到你。干杯!

答案 1 :(得分:1)

只要你在构造函数

中指定了3个args,这对我来说就可以了
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

避免它的另一种方法可能是:

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

如果您要将功能添加到您的课程中(例如time_to_intint_to_time甚至add_time),那么您需要缩进一个级别的4个空格并添加self到您的方法参数

答案 2 :(得分:1)

Hii Mathers25,
我解决了你的问题,试试下面的代码来获得最佳输出,

App ID  Ref Id  App Type  Reg Date
1       1       Main      2017-05-13
2       2       Sub       2017-05-14
3       1       Sub       2017-05-16
4       2       Main      2017-05-15
5       3       Main      2017-05-14
6       1       sub       2017-05-17
7      null     Main      2017-05-20

答案 3 :(得分:-1)

适合我:

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

print(C.x)

但你不应该这样做。当类是“创建”时,类级别的代码正在执行,通常你需要静态方法或类方法(用@staticmethod@classmethod修饰)并在某个函数/实例化类中执行代码。如果这是简单的脚本,您也可以在顶层(模块)级别执行它。你的代码片段是“不好的做法”:类级别(我说的是缩进)是用于声明,而不是用于执行某些操作。在类级别上执行与C宏类似的代码是正常的:例如,调用decorator,转换一些方法/属性/ etc - 静态的“纯”函数!