Python: 在这种情况下使用isinstance()是否必要?

5

我定义了一个名为Time的类,它有三个整型属性:hrs, min, sec

我还定义了两个方法intToTime()timeToInt(),分别用于将Time实例转换为表示该时间的秒数(int类型),以及将表示秒数的int类型转换回Time实例。

我希望能够实现__add__方法,这样我就可以进行如"TimeA + TimeB"或"TimeA + 100"这样的操作,其中100是要添加到TimeA中的秒数。

由于Python中没有重载机制,因此我想将这两个方法合并到一起。

def __add__(self,num):
    return Time.intToTime(self,Time.timeToInt(self)+num)

def __add__(self,other):
    return Time.intToTime(self,Time.timeToInt(self)+Time.timeToInt(other))

"num" 应该是一个整数,"other" 是另一个时间实例。我知道一种使用 isinstance() 的方法。但我的问题是,在这种情况下,如何在不使用 isinstance() 的情况下实现这样的“add”操作?

但是你现在没有使用isinstance。 - Eenvincible
1
后者的__add__会覆盖前者,因为Python中没有方法重载。 - Wu Fan
在这里,一个Time实例仅仅是由三个整型变量hrs、min和sec组成的组合。 - Wu Fan
3
如果我处在你的位置,我会取消整数加法中秒的含义,并且如果有必要,添加一个只需要秒数而不需要小时和分钟的便捷构造函数。t + Time.seconds(5)t + 5更容易理解——加上了什么? - user395760
1
个人而言,我认为您不应该能够将 int 添加到 Time 中。在您的示例中,即 timeA + 100,从代码结构上并不清楚这个 100 应该代表什么(小时?纳秒?千年?)。您应该要求客户明确说明:timeA + Time(seconds=100) - Benjamin Hodgson
@delnan你比我快了 :) - Benjamin Hodgson
3个回答

7

您真正有两个选择:EAFP或LYBL。 EAFP(先求谅解,后征得许可)意味着使用try / except:

def __add__(self, other):
   try:
       return Time.intToTime(self, Time.timeToInt(self)+Time.timeToInt(other))
   except AttributeError as e:
       return Time.intToTime(self, Time.timeToInt(self) + other)

需要注意,Time.timeToInst(self)有点奇怪;通常应该写成self.timeToInt()

LYBL表示在跳跃之前先看清 - 即使用isinstance。您已经知道这个了。


1
这在我看来太大了。如果“AttributeError”发生在其他地方会怎样呢?我会这样做:try: add = Time.timeToInt(other) \n except AttributeError as e: add = other,然后使用add进行加法操作:return Time.intToTime(self, Time.timeToInt(self) + add) - glglgl

1

你最好将intToTimetimeToInt作为模块级别的函数,与你的Time类处于相同的级别,并像这样实现你的__add__

def __add__(self, num):
    if isinstance(num, Time):
        num=timeToInt(num)
    elif not isinstance(num, int):
        raise TypeError, 'num should be an integer or Time instance'
    return intToTime(timeToInt(self)+num)

0

在Python中可以使用重载,但需要额外的代码来处理。您可以在名为pythonlangutil的包中找到所需内容,该包可在pypi上获得。

from pythonlangutil.overload import Overload,signature

@Overload
@signature("int")
def __add__(self,num):
    return Time.intToTime(self,Time.timeToInt(self)+num)

@__add__.overload
@signature("Time")
def __add__(self,other):
    return Time.intToTime(self,Time.timeToInt(self)+Time.timeToInt(other))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接