我使用描述符来强制使用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 :(得分:0)
您可以尝试获取类变量并进行检查。
cls_attr = getattr(obj.__class__, 'loss_factor', None)
if isinstance(cls_attr, Spectrum):
pass #TODO something
应该尝试使用有趣的名称获取class属性(我说尝试因为类可以具有或不具有此属性)
如果您尝试使用所有者类__get__
方法获取描述符将以None作为实例运行,并且将运行以下代码。
def __get__(self, instance, cls):
if instance is None:
return self
在此之后,将具有描述符实例属性的描述符,并且检查isinstance
将成功。