Python静态方法

时间:2018-02-13 11:01:49

标签: python python-3.x

面向对象的python,我想创建一个静态方法,将小时,分钟和秒转换为秒。

我创建了一个名为Duration:

的类
    class Duration:
        def __init__(self, hours, minutes, seconds):
            self.hours = hours
            self.minutes = minutes
            self.seconds = seconds

然后我创建了一个名为duration1的变量,我在其中给出了数字

duration1 = Duration(29, 7, 10)

我有一个名为info的方法,用于检查是否有任何数字小于10,如果是,则添加" 0"在它之前,然后我将值恢复为整数。

def info(self):
    if self.hours < 10:
        self.hours = "0" + str(self.hours)

    elif self.minutes < 10:
        self.minutes = "0" + str(self.minutes)

    elif self.seconds < 10:
        self.seconds = "0" + str(self.seconds)

    info_string = str(self.hours) + "-" + str(self.minutes) + "-" + str(self.seconds)
    self.hours = int(self.hours)
    self.minutes = int(self.minutes)
    self.seconds = int(self.seconds)
    return info_string

现在我想创建一个static_method来将这些值转换为秒,并返回值,以便我可以用duration1调用它(至少我认为我应该怎么做...?

@staticmethod
def static_method(self):
    hour_to_seconds = self.hours * 3600
    minutes_to_seconds = self.minutes * 60
    converted_to_seconds = hours_to_seconds + minutes_to_seconds \
    + self.seconds
    return converted_to_seconds

duration1.static_method(duration1.info())

我想我的问题是如何使用此代码的静态方法来更改数字?我还应该告诉你这是一个学校作业,所以我必须使用静态方法来解决问题。非常感谢任何帮助!

错误消息说明:

hour_to_seconds = self.hours * 3600

属性错误:&#39; str&#39;对象没有属性&#39;小时&#39;

2 个答案:

答案 0 :(得分:1)

你快到了。

不是将duration1.info()的结果传递给duration1.static_method(),而是简单地传递整个对象:

duration1 = Duration(29, 7, 10)
print(duration1.info()) # 29-07-10
print(duration1.static_method(duration1)) # 104830

由于它是一个静态方法,你也可以从类而不是实例中调用它(这就是为什么人们想要一个静态方法 - 你不必创建一个实例):

print(Duration.static_method(duration1))

顺便说一句,如果您在静态方法中使用它,则不应将约定self用作参数名称,但无论如何它都适用,因为 - 正如我所说 - 它只是一个约定。这并不是self是一个“魔法”变量。

但你应该考虑重命名参数。

顺便说一下,static_method中有一个拼写错误,一旦你调用变量hour_to_seconds但是然后访问hours_to_seconds - 你需要决定一个。

答案 1 :(得分:0)

静态方法显式一个绑定到类而不是实例的函数。 Python中的self表示Python中的类的实例。

这些不是simpatico。

您可以通过将duration1传递给静态方法并将其接受参数的名称从self更改为duration或类似名称来使代码生效。