Python:在这种情况下是否需要isinstance()?

时间:2014-02-25 15:24:33

标签: python overloading

我定义了一个具有三个int属性的类Timehrs, min, sec

我定义了将intToTime()实例转换为Time的方法int,这是该时间内的秒数,还有一个方法timeToInt()相反。

我希望他们实现__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”应该是一个int,“other”是另一个Time实例。我知道使用isinstance()的一种方法。

但我的问题是, 在这种情况下,如何在不使用isinstance()的情况下实现这样的添加

3 个答案:

答案 0 :(得分: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 :(得分: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)

答案 2 :(得分: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))