2014-02-25 1 views
5

나는 세 가지 지능을 가지고 Time 속성 클래스를 정의 : hrs, min, sec파이썬 :이 경우 isinstance()가 필요합니까?

그리고 그 시간 (초)이며, 또한 방법 timeToInt()을 할 수 있다는 int,에 Time 인스턴스를 변환 방법 intToTime() 정의 역.

나는 그들을 __add__을 구현하고 싶습니다, 그래서 100 (초)이 TIMEA에 추가입니다 "TIMEA + TimeB"또는 "티 메아 + 100", 같은 일을 할 수 있습니다.

내가

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로, 있어야하는데, (파이썬에는 오버로드가 없기 때문에) 이러한 "기타"다른 시간 인스턴스 두 개의 병합하고자한다. 나는 isinstance()를 사용하는 한 가지 방법을 안다.

하지만 내 질문은 이 경우 어떻게 구현해야합니까? 을 isinstance()를 사용하지 않고 추가해야합니까?

+0

하지만 지금은 isintance를 사용하지 않습니다. – Eenvincible

+1

후자의'__add__'는 파이썬에서 메소드 오버로딩이 없기 때문에 이전의 것을 쉐도우합니다. –

+0

여기서 Time 인스턴스는 세 개의 int (hrs, min 및 sec)의 조합입니다. –

답변

7

EAFP 또는 LYBL의 두 가지 옵션이 있습니다.

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) 그 가지 이상한; EAFP은 (쉽게 권한보다 용서를 물어) 사용 시도/제외 의미 보통 self.timeToInt()이라고 쓰십시오.

LYBL은 도약하기 전에 즉 isinstance를 의미합니다. 당신은 이미 그것을 알고 있습니다.

+1

그것은 IMHO가 너무 큽니다. 'AttributeError'가 다른 곳에서 발생하면 어떻게 될까요? 나는 'add : Time.timeToInt (other) \ n을 AttributeError를 e : add = other'로 추가 한 다음'add'를 사용하여 추가한다.'return Time.intToTime (self, Time.timeToInt (self) + 추가)' – 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

파이썬에서 오버로드를 사용하는 것이 가능하지만, 추가 필요 코드를 처리 할 수 ​​있습니다. pypi에서 제공되는 pythonlangutil 패키지에서 찾고있는 것을 찾을 수 있습니다.

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))