簡體   English   中英

Python:在這種情況下是否需要isinstance()?

[英]Python: Is isinstance() necessary in this case?

我定義了一個具有三個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()的情況下實現這樣的添加

你真的有兩個選擇: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。 你已經知道了那個。

你最好制作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)

可以在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM