2013-06-29 4 views
1

설명자를 사용하여 numpy 배열을 사용합니다. 이 잘 작동하지만 지금 클래스의 특성이 Spectrum 인스턴스가 있는지 여부를 찾고 싶습니다. 내 생각은 obj.__dict__을 확인하고 isinstance(obj, Spectrum)을 사용했지만 Spectrum.__get__은 배열을 반환하므로 isinstance(obj, Spectrum)이 실패합니다. 이 문제를 해결할 방법이 있습니까?설명자 클래스에 액세스하기

class Spectrum(object): 
    """Class capable of containing spectral values.""" 

    def __init__(self, name, dtype='float64'): 
     self.name = name 

    def __get__(self, instance, cls): 
     if instance is None: 
      return self 
     else: 
      print instance.__dict__ 
      return instance.__dict__[self.name] 

    def __set__(self, instance, value): 
     if not isinstance(value, np.ndarray): 
      raise TypeError('Expected an ndarray') 
     instance.__dict__[self.name] = value 

    def __delete__(self, instance): 
     del instance.__dict__[self.name] 

class Material(object): 
    loss_factor = Spectrum(name='loss_factor', dtype='Float64') 

    def __init__(self): 
     self.loss_factor = np.array([1, 2, 3]) 

def main(): 
    obj = Material() 
    print isinstance(obj.loss_factor, Spectrum) 

답변

0

변수를 가져 와서 확인해 볼 수 있습니다.

cls_attr = getattr(obj.__class__, 'loss_factor', None) 
if isinstance(cls_attr, Spectrum): 
    pass #TODO something 

하나는 당신이 실행됩니다 소유자 클래스를 __get__ 방법을 사용하여 설명을 얻으려고한다면

(나는 클래스가이 없거나이 속성 수 있기 때문에 시도라고) 재미있는 이름을 가진 클래스 속성을 얻기 위해 시도해야 인스턴스가 없으면 다음 코드가 실행됩니다.

def __get__(self, instance, cls): 
     if instance is None: 
      return self 

이 후에는 설명자 인스턴스 속성이 설명자이고 확인이 성공하면 isinstance이 성공합니다.

관련 문제