2013-06-29 138 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 

一個應該嘗試class屬性,有趣的名字(我說的嘗試,因爲類可以有或沒有這個屬性)

如果您將嘗試使用主階級__get__方法來獲取描述符將與運行沒有作爲實例和下面的代碼將運行。

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

此後,將有一個描述符實例屬性描述符,並檢查isinstance將成功。