我应该如何在python中向int添加方法?

fer*_*raz 4 python oop methods int class

(这是一个与学习相关的问题,所以我为什么要做或不做任何事情的建议,以及推荐的资源来使这些事情变得更好,不仅仅是好的.)

我正在尝试在python中学习OOP,并做了一个简单的"Time"类,如下所示:

class Time(object):

    """A time representation."""

    def __init__(self, hours=0, minutes=0, seconds=0):
        self.hours = hours
        self.minutes = minutes
        self.seconds = seconds

    def __int__(self):
        return self.hours * 3600 + self.minutes * 60 + self.seconds
Run Code Online (Sandbox Code Playgroud)

现在,__ int __方法让我从"Time"实例中获取一个int,它代表我所做的时间(但以秒为单位)int(Time(3, 4, 5)).顺便说一下,我觉得这很棒.但是,为了使用它,知道如何使"int"有一个返回"Time"对象的新方法会很好,所以3643.time()可以这样做.

为什么?由于各种原因:

  1. 因为这样我现在才知道对我来说是什么样的黑魔法.(这些突出的事情使事情发生......以及相关的东西)

  2. 因为我不知道为什么我不应该.(请告诉我)

我想我可以在任何课程之外做类似以下的事情:

def time(seconds):
    """Return an HH:MM:SS stamp of "seconds", where "seconds" should be an int."""
    hours, minutes = 0, 0
    if seconds >= 3600:
        hours, seconds = divmod(int, 3600)
    if seconds >= 60:
        minutes, seconds = divmod(int, 60)
    return "{:02d}:{:02d}:{:02d}".format(hours, minutes, seconds)
Run Code Online (Sandbox Code Playgroud)

但这似乎与这些对象没有足够的关系,它似乎没有太多的面向对象......所以,我认为也许有更好的方法来处理这种事情.

Sin*_*ion 10

不,你无法真正为int添加方法.你可以继承int,并从你的__int__方法中返回它,但这对你没有多大帮助,因为调用int()它仍然会返回一个常规的int.

你使用常规函数转换回来的想法Time()是正确的,但是将它作为一个类方法可能会很好,所以它更明显地与它有关:

class Time(object):
    @classmethod
    def from_seconds(cls, seconds):
         _hours, _minutes, _seconds = ...
         return cls(_hours, _minutes, _seconds)
Run Code Online (Sandbox Code Playgroud)

  • 对于记录,这通常称为*命名构造函数*. (4认同)
  • 你可能希望保留`Time(object):`因为我们现在都在使用新的样式类:) (2认同)