[英]Python: Is isinstance() necessary in this case?
我定義了一個具有三個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()的情況下實現這樣的添加 ?
你真的有兩個選擇: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。 你已經知道了那個。
你最好制作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)
可以在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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.