2014-04-16 3 views
0

정수에 대해 n 값을 만들려고합니다. 내가 생각하고있는 디자인은 다음과 같다. 내가 만들고 클래스 정의 헤더 때는 isNaN 람다 기능이 필요하지만 오류클래스 헤더의 lambda 함수

import numpy as np 

class Integer(object): 
    type = int 
    nan = -1 
    isnan = lambda val: val==-1 
    def __new__(cls, value): 
     return cls.type(value) 

class Float(object): 
    type = float 
    isnan = lambda val: np.isnan(val) 
    def __new__(cls, value): 
     return cls.type(value) 

를 반환하지만

>> Integer.isnan(1) 
>> Traceback (most recent call last): 
>> File "<stdin>", line 1, in <module> 
>>TypeError: unbound method <lambda>() must be called with Integer instance as first argument (got  int instance instead) 

답변

2

문제는 isnan 기능을 파이썬으로 인스턴스 메소드로 취급되고 있다는 점이다. "언 바운드 (unbound)"를 사용하고 있지만 Python 2는 메소드의 첫 번째 인수가 클래스의 인스턴스 (예 : self)인지 확인하기 위해 유형 검사를 수행합니다. 파이썬 3에서는 언 바운드 메소드가 삭제되고 코드가 정상적으로 작동합니다.

당신은 staticmethod 통해 람다 함수를 전달하여이 문제를 해결할 수 있습니다

isnan = staticmethod(lambda val: val == -1) 

또는 당신이 장식으로 staticmethod으로, 일반 함수 정의를 사용할 수 있습니다 : 그

@staticmethod 
def isnan(value): 
    return val == -1 

참고 경우 클래스가 type 값에서 상속되도록하려면 isnan을 실제 인스턴스 메서드로 호출 할 수 있습니다.

class Integer(int): 
    # no __new__ needed 
    def isnan(self): 
     return self == -1 

이렇게하면 현재 코드에서 수행하는 작업보다 Integer(5).isnan()을 호출 할 수 있습니다.

마지막으로 하나의 제안 : 이미 type 클래스의 이름이므로 type을 변수 이름으로 사용하지 마십시오. 클래스 속성으로 변수를 사용할 때 (내장 함수를 숨길 곳) 클래스를 사용하면 나쁘지는 않지만 여전히 혼란 스러울 수 있습니다.

1

당신은 그것을 정적 메서드 할 필요가 오류를 반환합니다. 두 가지 선택 :

class Integer(object): 
    type = int 
    nan = -1 

    @staticmethod 
    def isnan(v): 
     return v == -1 

    isnan_lambda = staticmethod(lambda v: v == -1) 

    def __new__(cls, value): 
     return cls.type(value) 

print Integer.isnan(5) 
print Integer.isnan(5)