我定义了一个具有三个int属性的类Time
:hrs, 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()的情况下实现这样的添加?
答案 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)
您最好制作intToTime
和timeToInt
模块级功能,与您的班级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))