我是否应该,以及如何在python中向int添加方法?
(这是一个与学习相关的问题,因此关于我为什么应该做或不做任何事情的任何建议,以及让这些事情变得更好的建议资源,都比wellcome更重要。) 我试图学习python中的OOP,并完成了一个简单的“时间”类,如下所示:我是否应该,以及如何在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
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
,在这些情况下,请确保从对象继承。