我是否应该,以及如何在python中向int添加方法?

我是否应该,以及如何在python中向int添加方法?,python,class,oop,methods,int,Python,Class,Oop,Methods,Int,(这是一个与学习相关的问题,因此关于我为什么应该做或不做任何事情的任何建议,以及让这些事情变得更好的建议资源,都比wellcome更重要。) 我试图学习python中的OOP,并完成了一个简单的“时间”类,如下所示: class Time(object): """A time representation.""" def __init__(self, hours=0, minutes=0, seconds=0): self.hours = hours

(这是一个与学习相关的问题,因此关于我为什么应该做或不做任何事情的任何建议,以及让这些事情变得更好的建议资源,都比wellcome更重要。)

我试图学习python中的OOP,并完成了一个简单的“时间”类,如下所示:

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
现在,这个\uuuu int\uuuu方法允许我从“时间”实例中获取一个int,当我执行
int(时间(3,4,5))
时,它表示时间(但以秒为单位)。顺便说一句,我觉得这有点棒。但是,为了使用它,最好知道如何使“int”有一个返回“Time”对象的新方法,这样就可以执行类似于
3643.Time()
的操作

为什么?? 出于各种原因:

  • 因为这样我就知道了现在对我来说什么是黑魔法。(这些都是让事情发生的事情……以及相关的事情)

  • 因为我不知道为什么我不应该。(请告诉我)

  • 我想我可以在任何课堂之外做如下事情:

    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)
    

    但这似乎与这些对象没有足够的关系,它似乎没有那么多面向对象的。。。所以,我认为可能有更好的方法来处理这类事情。

    不,你不能真的向int添加方法。你可以对int进行子类化,然后从
    \uuu int\uuu
    方法返回,但这对你帮助不大,因为调用
    int()
    仍然会返回一个常规的int

    您使用常规函数将其转换回
    Time()
    的想法是正确的,但将其作为一个类方法可能会更好,这样它的关系就更为明显了:

    class Time(object):
        @classmethod
        def from_seconds(cls, seconds):
             _hours, _minutes, _seconds = ...
             return cls(_hours, _minutes, _seconds)
    

    在我看来,除非对象代表一个普通的数字量,否则提供
    \uuuu int\uuu
    方法可能是个坏主意。(在您的示例中,我认为从午夜开始以秒为单位调用
    int()。不包括名称空间的原因(如果另一个模块也添加了
    int.time
    方法会发生什么情况?),关注点分离(为什么int应该知道如何将自己转换为类?),不需要名称空间的事实,
    10.time()
    ,您必须编写
    10.time())
    而不是
    10.time()
    因为一个lexer怪癖,任何可能的实现的一般性黑客行为(不可靠、模糊),以及Rubyist这样做的事实;-)而且,感觉不到OO的东西不一定是坏事。Python允许您混合和匹配OOP和良好的旧程序编程,以避免在.Oh中迷失方向,还有一件事:如果
    Time
    类不仅仅是一个示例或学习,那么请忘记它。时间是艰难的,而现有的解决方案(如
    datetime
    模块)在几乎所有意义上都更好。@delnan谢谢,这是为了学习。你给了我我真正想要看的概念。作为记录,这通常被称为命名构造函数。你可能想保留
    时间(对象):
    ,因为我们现在都在使用新样式的类:)另一种方法是编写主构造函数以接受多种输入。好的,谢谢。这很有趣。我会尽量熟悉它。好吧,我猜
    \uuu int\uuu
    意味着ferhtgoldaraz正在使用python 3。是的,在Python2中,这个方法被称为
    \uuuuu index\uuuu
    ,在这些情况下,请确保从
    对象继承。